IEnumerator的yield返回null

我目前正在尝试理解Unity中的IEnumerator&Coroutine,并且对“yield return null”执行的内容不太自信。 目前我相信它基本上会暂停并等待下一帧,并在下一帧中再次执行while语句。

如果我省略“yield return null”,那么对象会立即移动到目的地,或者“跳过很多帧”。 所以我想我的问题是这个“yield return null”函数在这个while循环中是如何的,为什么它有必要拥有它。

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());
}

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

创建协程时,Unity将其附加到MonoBehaviour对象。 它将在StartCoroutine调用之前运行,直到获得收益。 然后它将从协程返回并根据产量将其放到堆栈上。 如果为空,那么它将再次运行下一帧。 如果某些协程需要在特定时刻执行操作,则可能需要WaitForEndOfFrame。 在某些情况下,您可能会像在第二种情况下那样启动计时器。

此时,协程已关闭,程序可以运行剩余的程序。 在下一帧中,Unity会发现堆叠的协程,并会从他们离开的地方调用它们。 如果你的循环从未达到真实条件,那么你基本上创建了一个更新方法。

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

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


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

“为什么这是必要的”可能是因为你希望对象每帧输入一个输入。 如果没有yield return null它只会在一帧中通过while循环执行。

更重要的是:它看起来像你想Update每一帧,并调整psoition。 你可以很容易地使用Update () 。 这个函数将在活动脚本的每一帧被Unity调用。

链接地址: http://www.djcxy.com/p/53177.html

上一篇: IEnumerator's yield return null

下一篇: Unity2D: Start a new Coroutine whenever a button has been pressed