【问题标题】:Coroutine yield return null [duplicate]协程收益返回null [重复]
【发布时间】:2019-06-20 07:11:24
【问题描述】:

这是我的第一个问题..

我学习如何使用 C# 和 Unity 制作游戏,所以我遇到了 协程,我知道这些方法是如何工作的,但有一点我不明白:

yield return null

例如:

IEnumerator Attack(){
   // Somecode..
   while(true){
   //DoSomething..
   yield return null
}
}

已在此处提出此问题:Unity - IEnumerator's yield return null

但我还需要更多解释

如果这个问题很愚蠢,请原谅我,但就像我说的那样,我只是在学习。

谢谢。

【问题讨论】:

  • “更多解释”比较模糊,具体有什么不明白的地方? yield return null 显然(如果我没看错的话)会让协程在下一帧继续。
  • 对不起,这就是“继续下一帧!”这甚至意味着什么?@LasseVågsætherKarlsen
  • 从 IEnumerable.GetEnumerator 在枚举器上调用 MoveNext 时继续
  • 你可以把协程想象成带有额外控制的更新。在给定 MonoBehaviour 的情况下,已启动的协程被添加到 tge 的列表中,当编译器运行它们时,如果它遇到 yield return null,它会停止协程并将其设置回列表中。运行当前帧并开始下一帧。在某些时候,编译器会处理协程列表并再次运行协程,直到方法结束或达到另一个产量。在第一种情况下,协程对象被释放,在第二种情况下,它被重新设置在列表中并再次运行。

标签: c# visual-studio unity3d coroutine


【解决方案1】:

每个游戏都是基于循环的。您可以在简化图中看到这个逻辑:

Here's full Unity frame logic chart 感谢@Draco18s。

此循环的一次迭代称为“帧”。 yield return null 就像循环中的 continue 关键字一样工作 - 它只是继续进行下一个游戏循环迭代,即“帧”。

为了更好地理解,让我们创建一个每帧打印当前帧号的协程:

void Awake () {
    StartCoroutine(PrintFrameCount());
}

IEnumerator PrintFrameCount() {
    for (;;) {           
        Debug.Log(Time.frameCount);
        yield return null;
    }
}

这样的协程只打印当前帧计数的不同值,只能通过在不同帧中打印来更改。

【讨论】:

  • 对未来读者的小注解:yielding 在某些情况下,不同的值可能很重要,因为它们会被“拾取”并在周期的不同点继续。例如,yield null几乎在顶部,就在所有 Update() 调用之后,而 yield WaitForEndOfFrame 一直在底部。如果您需要等待其他事情完成并且您知道它们将完成“此帧”但尚未处理并且您不想一直等到下一个 i> 框架。然而,在大多数情况下,这些区别并不那么重要。
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多