我目前正在尝试在Unity的上下文中理解IEnumerator和Coroutine,并且对"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()); }
Everts.. 22
程序将启动循环,如果没有产量,它只是在同一帧内运行所有迭代.如果您有数百万次迭代,那么它很可能会阻止您的程序,直到所有迭代完成然后继续.
在创建协同程序时,Unity会将其附加到MonoBehaviour对象.它将在StartCoroutine的第一次调用中运行,直到达到产量.然后它将从协程返回并根据产量将其放置到堆栈中.如果为null,则它将在下一帧再次运行.如果某个协程需要在该特定时刻执行操作,则可以使用WaitForEndOfFrame.在某些情况下,您可以像第二种情况一样启动计时器.
此时,协程已关闭,程序可以运行其余部分.在下一帧,Unity将找到堆叠的协程,并将从他们中断的地方打电话给他们.如果您的循环永远不会达到真实条件,那么您基本上创建了一个更新方法.
协程的目的是执行跨越一段时间而不阻塞程序的操作.
重要事实:这不是多线程.
程序将启动循环,如果没有产量,它只是在同一帧内运行所有迭代.如果您有数百万次迭代,那么它很可能会阻止您的程序,直到所有迭代完成然后继续.
在创建协同程序时,Unity会将其附加到MonoBehaviour对象.它将在StartCoroutine的第一次调用中运行,直到达到产量.然后它将从协程返回并根据产量将其放置到堆栈中.如果为null,则它将在下一帧再次运行.如果某个协程需要在该特定时刻执行操作,则可以使用WaitForEndOfFrame.在某些情况下,您可以像第二种情况一样启动计时器.
此时,协程已关闭,程序可以运行其余部分.在下一帧,Unity将找到堆叠的协程,并将从他们中断的地方打电话给他们.如果您的循环永远不会达到真实条件,那么您基本上创建了一个更新方法.
协程的目的是执行跨越一段时间而不阻塞程序的操作.
重要事实:这不是多线程.