如何在每x秒后在Unity3D中运行一些代码?

时间:2013-08-12 19:21:42

标签: unity3d

我需要每隔x秒执行一次代码,直到在Unity3D C#中满足条件。只要条件为真,代码应该与其他代码无关地运行,否则停止。一旦条件变为假,它应该停止执行并在条件变为真时再次运行(如果可能,再次从0开始计算秒数)。怎么做?

3 个答案:

答案 0 :(得分:3)

这样的事情应该有效。

void Start(){
    StartCoroutine("DoStuff", 2.0F);
}

IEnumerator DoStuff(float waitTime) {
    while(true){
        //...do stuff here
        if(someStopFlag==true)yield break;
        else yield return new WaitForSeconds(waitTime);
    }
}

答案 1 :(得分:3)

实际上,有一个比使用协同程序更好的方法。 InvokeRepeating方法具有较少的开销,并且不需要丑陋的while(true)构造:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    public Rigidbody projectile;
    public bool Condition;
    void LaunchProjectile() {
        if (!Condition) return;
        Rigidbody instance = Instantiate(projectile);
        instance.velocity = Random.insideUnitSphere * 5;
    }
    void Start() {
        InvokeRepeating("LaunchProjectile", 2, 0.3F);
    }
}

另外,您的病情如何定义?如果它是一个属性会更好 - 这样你就不必每次都检查它:

public class Example : MonoBehaviour {
    public Rigidbody projectile;
    private bool _condition;
    public bool Condition {
        get { return _condition; }
        set
        {
            if (_condition == value) return;
            _condition = value;
           if (value)
               InvokeRepeating("LaunchProjectile", 2, 0.3F);
           else
                CancelInvoke("LaunchProjectile");
    }
    void LaunchProjectile() {
        Rigidbody instance = Instantiate(projectile);
        instance.velocity = Random.insideUnitSphere * 5;
    }
}

答案 2 :(得分:1)

MonoBehaviour.InvokeRepeating

  

说明:以秒为单位调用方法methodName,然后每重复一个retrateRate秒重复一次。

     

注意:如果将时间标度设置为0,则此方法无效。

using UnityEngine;
using System.Collections.Generic;

// Starting in 2 seconds.
// a projectile will be launched every 0.3 seconds

public class ExampleScript : MonoBehaviour
{
    public Rigidbody projectile;

    void Start()
    {
        InvokeRepeating("LaunchProjectile", 2.0f, 0.3f);
    }

    void LaunchProjectile()
    {
        Rigidbody instance = Instantiate(projectile);

        instance.velocity = Random.insideUnitSphere * 5;
    }
}