当前位置:  开发笔记 > 编程语言 > 正文

Unity - IEnumerator的yield返回null

如何解决《Unity-IEnumerator的yield返回null》经验,为你挑选了1个好方法。

我目前正在尝试在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将找到堆叠的协程,并将从他们中断的地方打电话给他们.如果您的循环永远不会达到真实条件,那么您基本上创建了一个更新方法.

协程的目的是执行跨越一段时间而不阻塞程序的操作.

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



1> Everts..:

程序将启动循环,如果没有产量,它只是在同一帧内运行所有迭代.如果您有数百万次迭代,那么它很可能会阻止您的程序,直到所有迭代完成然后继续.

在创建协同程序时,Unity会将其附加到MonoBehaviour对象.它将在StartCoroutine的第一次调用中运行,直到达到产量.然后它将从协程返回并根据产量将其放置到堆栈中.如果为null,则它将在下一帧再次运行.如果某个协程需要在该特定时刻执行操作,则可以使用WaitForEndOfFrame.在某些情况下,您可以像第二种情况一样启动计时器.

此时,协程已关闭,程序可以运行其余部分.在下一帧,Unity将找到堆叠的协程,并将从他们中断的地方打电话给他们.如果您的循环永远不会达到真实条件,那么您基本上创建了一个更新方法.

协程的目的是执行跨越一段时间而不阻塞程序的操作.

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有