我需要每 x 秒执行一次代码,直到在 Unity3D C# 中满足条件。只要条件为真,代码就应该运行而不管其他代码如何,否则就停止。一旦条件变为假,它应该停止执行并在条件变为真时再次运行(如果可能,再次从 0 开始计数秒数)。怎么做?
实际上,有一个比使用协程和yield 更好的方法。调用重复方法的开销较小,并且不需要丑陋的 while(true) 构造:
\n\nusing 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\npublic 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
像这样的事情应该有效。
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)