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

Tem*_* Id 3 unity-game-engine

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

Max*_*kov 6

实际上,有一个比使用协程和yield 更好的方法。调用重复方法的开销较小,并且不需要丑陋的 while(true) 构造:

\n\n
using UnityEngine;\nusing System.Collections;\n\npublic class Example : MonoBehaviour {\n    public Rigidbody projectile;\n    public bool Condition;\n    void LaunchProjectile() {\n        if (!Condition) return;\n        Rigidbody instance = Instantiate(projectile);\n        instance.velocity = Random.insideUnitSphere * 5;\n    }\n    void Start() {\n        InvokeRepeating("LaunchProjectile", 2, 0.3F);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,你的病情是如何定义的?如果它是一个属性 \xe2\x80\x94 那就更好了,这样你就不必每次都检查它:

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

  • [这里是](http://forum.unity3d.com/threads/67856-Coroutines-vs-Update)[链接](http://answers.unity3d.com/questions/189917/any-costs-i- should-know-about-linked-with-invo.html)有关开销。密切关注这些链接中的基准测试,5000 个对象的 4 毫秒峰值对我来说并不意味着效率低下。另外,上次我检查过,您无法在运行时修改 InvokeRepeating 的重复率。毫无疑问,InvokeRepeating 更干净。 (2认同)

Jer*_*dak 5

像这样的事情应该有效。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)