c# - Unity - IEnumerator 的 yield 返回 null

标签 c# unity3d yield coroutine ienumerator

我目前正在尝试在 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/

相关文章:

c# - 用一个字符替换字符串中的整个字符

c# - 程序 (c#) 运行提升,仍然无法访问某些文件

user-interface - Unity - 对所有 UI 元素应用后处理效果

Unity3D 碰撞器更像海绵而不是实体

python - 使用过滤器和生成器在 python 中生成无限素数

python - 在 __iter__() 中使用 yield 有什么好处?

c# - 如何在 Azure Functions Bot 中注册帮助/重置/设置可评分(非主动)?

c# - 已删除 用户在其他浏览器上删除后仍登录

c# - 无法在Unity游戏中接收UDP数据包

python - 哪个通常更快,产量或附加?