我使用Coroutine设置重复延迟如下。
在我的清醒中我有
StartCoroutine(RandomMove());
然后再往下走
IEnumerator RandomMove()
{
while (true)
{
// print(Time.time);
yield return new WaitForSeconds(foo);
// print(Time.time);
}
}
其中' foo'是随机浮点值,我随每次迭代而改变。 让我们说foo是10秒,并且通过延迟的一部分,我需要重置延迟,以便它开始倒计时#39;从10岁开始。
我将如何做到这一点?我应该使用定时器吗?
答案 0 :(得分:3)
我不喜欢现有的两个答案中的任何一个。这就是我要做的事情:
我们将从killer_mech的答案的这一部分开始:
Coroutine myCoroutine;
void Awake() {
myCoroutine = StartCoroutine(RandomMove());
}
但我们将以不同方式处理其余部分。 killer_mech永远做了任何带引用的东西,而不是继续写它。
以下是我们正在做的事情:
public void resetRandomMove() {
StopCoroutine(myCoroutine);
myCoroutine = StartCoroutine(RandomMove());
}
每次需要重置时都要调用它。
答案 1 :(得分:1)
我建议您先将Coroutine存储在一个变量中。
Coroutine myCoroutine;
void Awake()
{
myCoroutine = StartCoroutine(RandomMove());
}
并将协程函数更改为
IEnumerator RandomMove()
{
// print(Time.time);
yield return new WaitForSeconds(foo);
// print(Time.time);
// Call your new coroutine here
myCoroutine = StartCoroutine(RandomMove());
}
这样,每次迭代都会有一个coroutine变量。如果你需要停止协程,只需说:
StopCoroutine(myCoroutine);
在所需的时间。这将允许你在倒计时结束前停止中间的协程。同时在协程结束时,它将启动新协程并更新参考完成任务后,只需再次回电
myCoroutine = StartCoroutine(RandomMove());
希望这可以解决您的问题。是的,你可以使用计时器和布尔标志同样的事情,但我认为使用协程更简单。
答案 2 :(得分:1)
嗯,它也可能是这样的。只是为了我自己。
void Start() {
StartCoroutine(RepeatingFunction());
}
IEnumerator RepeatingFunction () {
yield return new WaitForSeconds(repeatTime);
StartCoroutine( RepeatingFunction() );
}
据我了解这个问题。 InvokeRepeating()
也是一种选择。
答案 3 :(得分:0)
也许是因为你是每个帧等待新分配的秒?
为什么在产生等待之前不做随机,并存储CustomYieldInstruction而不是产生一个新实例,因为它处理之前的那个,这会产生内存问题。您不会注意到,如果您返回一个具有常量值的WaitForSeconds,但是可能使用随机值会产生歧义并重置计时器(请参阅此Unity's optimization page, on the Coroutine's section)。一个简单的例子:
public float foo;
public float min;
public float max;
void Awake()
{
StartCoroutine(Countdown());
}
IEnumerator Countdown()
{
while(true)
{
foo = Random.Range(min, max);
WaitForSeconds wait = new WaitForSeconds(foo);
yield return wait;
}
}
另外,@ ryeMoss的解决方案看起来很不错,如果foo'变化。
希望它有所帮助。