重置重复的Coroutine延迟

时间:2018-05-03 15:16:42

标签: c# unity3d coroutine

我使用Coroutine设置重复延迟如下。

在我的清醒中我有

StartCoroutine(RandomMove());

然后再往下走

IEnumerator RandomMove()
    {
       while (true)
        {
            // print(Time.time);
            yield return new WaitForSeconds(foo);
            // print(Time.time);
        }

    }

其中' foo'是随机浮点值,我随每次迭代而改变。 让我们说foo是10秒,并且通过延迟的一部分,我需要重置延迟,以便它开始倒计时#39;从10岁开始。

我将如何做到这一点?我应该使用定时器吗?

4 个答案:

答案 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'变化。

希望它有所帮助。