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调用。
上一篇: IEnumerator's yield return null
下一篇: Unity2D: Start a new Coroutine whenever a button has been pressed