Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 协同程序产生返回空_C#_Visual Studio_Unity3d_Coroutine - Fatal编程技术网

C# 协同程序产生返回空

C# 协同程序产生返回空,c#,visual-studio,unity3d,coroutine,C#,Visual Studio,Unity3d,Coroutine,这是我的第一个问题 我正在学习如何使用C#和Unity制作游戏,因此我遇到了协同程序,我知道这些方法是如何工作的,但有一件事我不明白,那就是: yield return null 例如: IEnumerator Attack(){ // Somecode.. while(true){ //DoSomething.. yield return null } } 这里有人问了这个问题: 但我还需要更多的解释 如果这个问题很愚蠢,请原谅,但就像我说的,我只是在学习 多谢各位

这是我的第一个问题

我正在学习如何使用C#和Unity制作游戏,因此我遇到了协同程序,我知道这些方法是如何工作的,但有一件事我不明白,那就是:

yield return null
例如:

IEnumerator Attack(){
   // Somecode..
   while(true){
   //DoSomething..
   yield return null
}
}
这里有人问了这个问题:

但我还需要更多的解释

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


多谢各位

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

感谢@Draco18s

此循环的一次迭代称为“帧”<代码>产生返回空值像循环中的
继续
关键字一样工作-它只是继续到下一个游戏循环迭代,也称为“帧”

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

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

IEnumerator PrintFrameCount() {
    for (;;) {           
        Debug.Log(Time.frameCount);
        yield return null;
    }
}
这种协同程序只打印当前帧计数的不同值,只有在不同的帧中打印才能更改这些值


“更多解释”相当含糊,您不理解的具体内容是什么
yield-return-null
显然会(如果我读对了答案)使协同程序在下一帧继续。对此很抱歉,这就是“在下一帧继续!”这到底是什么意思?@LasseVågsætherkarlsentinue当调用IEnumerable.getEnumeratory中的枚举器MoveNext时,您可以认为协同路由就像具有额外控制的更新一样。对于tge给定的MonoBehavior,一个已启动的协程被添加到列表中,当编译器运行它们时,如果它遇到一个yield return null,它将与该协程一起停止,并将其设置回列表中。将运行当前帧,并开始下一帧。在某个时刻,编译器处理协程列表并再次运行协程,直到方法结束或达到另一个结果。在第一种情况下,协程对象被释放,在第二种情况下,它被放回列表中并再次运行。对于未来的读者来说,次要的注意事项是:
yield
ing在某些情况下,对不同的值进行处理可能很重要,因为它们将被“拾取”并在循环的不同点继续。例如,
yield null
几乎位于顶部,就在所有
Update()
调用之后,而
yield WaitForEndOfFrame
则位于底部。如果您需要等待其他事情完成,并且您知道它们将完成“此帧”,但尚未处理,并且您不想一直等到下一帧,那么这将非常有用。然而,在大多数情况下,这些区别并不那么重要。