Unity - IEnumerator的yield返回null

时间:2017-01-18 13:05:10

标签: c# unity3d yield coroutine ienumerator

我目前正在尝试了解IEnumerator&在Unity的背景下协同,并且对“yield return null”执行的内容不太自信。目前我认为它基本上暂停并等待下一帧,在下一帧中它将再次执行while语句。

如果我忽略“yield return null”,它似乎会立即移动到目的地或者“跳过很多帧”。所以我想我的问题是这个while循环中这个“yield return null”函数是怎么回事,为什么有必要这样做呢。

void Start () {
    StartCoroutine(Move());
}

IEnumerator Move(){

    while (a > 0.5f){

        ... (moves object up/down)

        yield return null; // <---------
    }

    yield return new WaitForSeconds(0.5f);

    .... (moves object up/down)

    StartCoroutine(Move());
}

2 个答案:

答案 0 :(得分:15)

程序将启动循环,如果没有屈服,它只是在同一帧内运行所有迭代。 如果您有数百万次迭代,那么它很可能会阻止您的程序,直到所有迭代完成然后继续。

创建协程时,Unity会将其附加到MonoBehaviour对象。它将在StartCoroutine的第一次调用中运行,直到达到产量。然后它将从协程返回并根据产量将其放置到堆栈中。如果为null,则它将在下一帧再次运行。如果某个协程需要在该特定时刻执行操作,则可以使用WaitForEndOfFrame。在某些情况下,您可以像在第二种情况下那样启动计时器。

此时,协程已关闭,程序可以运行其余部分。在下一帧,Unity将找到堆叠的协程,并将从他们中断的地方打电话给他们。 如果您的循环永远不会达到真实条件,那么您基本上创建了一个更新方法。

协程的目的是执行跨越一段时间而不会阻止程序的操作。

重要事实:这不是多线程。

答案 1 :(得分:4)

你是对的。 yield return null将等到下一帧,然后继续执行。在你的情况下,它将检查你的while循环的条件下一帧。

&#34;为什么这是必要的&#34;可能是因为您希望对象每帧都按输入移动。如果没有yield return null,它只会在一帧中执行while循环。

更重要的是:看起来你想要每帧Update并调整一下。您可以轻松地使用Update ()。 Unity在活动脚本的每一帧都会调用此函数。