Unity - IEnumerator 的产量 return null

Unity - IEnumerator's yield return null

我目前正在尝试在 Unity 的上下文中理解 IEnumerator 和协程,但对 "yield return null" 的性能不太自信。目前我相信它基本上暂停并等待下一帧,在下一帧中它会返回再次执行 while 语句。

如果我省略 "yield return null" 似乎对象会立即移动到它的目的地或者可能 "skip a lot of frames"。所以我想我的问题是这个 "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());
}

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

"why this is necessary" 可能是因为您希望对象每帧通过输入移动。没有 yield return null 它只是在一帧中通过 while 循环执行。

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

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

创建协程时,Unity 将其附加到 MonoBehaviour 对象。它将 运行 首先调用 StartCoroutine 直到达到产量。然后它将 return 从协程中取出,并根据产量将其放入堆栈中。如果你 yield null,那么它会在下一帧再次 运行。有许多不同的 YieldInstruction 可以从协程 returned,您可以阅读更多关于它们的信息 here and through the related links.

协程产生后,主线程将继续 运行ning。在下一帧,Unity 将找到堆叠的协程,并从它们停止的地方调用它们。 如果您的协程从未 运行 超出范围,那么您基本上创建了一个更新方法。

协程的目的是在不阻塞程序的情况下执行可以跨越一段时间的操作。

重要事实:这不是 multi-threading。