我目前正在尝试在 Unity 的上下文中理解 IEnumerator 和协程,但我对“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());
}
最佳答案
程序将开始循环,如果您没有 yield ,它只会在同一帧内运行所有迭代。 如果您有数百万次迭代,那么它很可能会阻塞您的程序,直到所有迭代都完成,然后再继续。
创建协程时,Unity 将其附加到 MonoBehaviour 对象。它将首先在调用 StartCoroutine 时运行,直到达到 yield 为止。然后它将从协程返回并根据产量将其放入堆栈。如果你 yield null,那么它将在下一帧再次运行。协程可以返回许多不同的 YieldInstruction,您可以阅读更多关于它们的信息 here and through the related links .
一旦协程产生,主线程继续运行。在下一帧,Unity 将找到堆叠的协程,并从它们停止的地方调用它们。 如果你的协程永远不会超出范围,那么你基本上创建了一个更新方法。
协程的目的是在不阻塞程序的情况下执行可能跨越一段时间的操作。
重要事实:这不是多线程。
关于c# - Unity - IEnumerator 的 yield 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720221/