我需要每隔x秒执行一次代码,直到在Unity3D C#中满足条件。只要条件为真,代码应该与其他代码无关地运行,否则停止。一旦条件变为假,它应该停止执行并在条件变为真时再次运行(如果可能,再次从0开始计算秒数)。怎么做?
答案 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)
说明:以秒为单位调用方法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; } }