我正在使用 Unity3D 的 StartCoroutine 方法我有一个关于嵌套协程的问题。
通常,嵌套协程可能看起来像这样:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
yield return StartCoroutine(InnerCoroutine());
//Finish Doing Stuff . . .
}
IEnumerator InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
这很好,但确实没有必要。可以这样实现同样的效果:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
while(innerCoroutineEnumerator.MoveNext())
yield return innerCoroutineEnumerator.Current;
//Finish Doing Stuff . . .
}
IEnumerable InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
我发现这种方法产生的垃圾(这在 Unity 中可能是个问题)比使用多个 StartCoroutines 更少;因此它非常有用,尤其是在处理许多嵌套层时。
现在我的问题是:
不是像这样使用 IEnumerable InnerCoroutine(){}
和获取枚举数:
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
我想使用 IEnumerator InnerCoroutine(){}
并像这样获取枚举器:
IEnumerator innerCoroutineEnumerator = InnerCoroutine();
它们一样吗?
除了在我的测试中速度更快之外,这种方法还允许我通过正常的 StartCoroutine 方法使用“内部协程”方法,这在以后可能会有用。
我已经进行了测试,据我所知,这两种技术都在有效地做同样的事情,但我在整个编码方面还是比较陌生,所以我有可能遗漏了一些东西。
最佳答案
的确,两种写法产生的结果是一样的。
这更像是一个 C# 问题,Unity3D 只是在他们的协程系统中使用这些类型。你可能会发现 this post answering in more details你的问题。
不过,我不太清楚你的意思
I have found this method produces less garbage (which can be an issue in Unity)
因为这两种方法应该产生相同的结果。在这一点上它更多的是代码风格的选择。
我个人更喜欢 StartCoroutine(InnerCoroutine())
一种方式,其中 InnerCoroutine()
会返回一个 IEnumerator
。我看不出为 InnerCoroutine()
返回一个 IEnumerable 然后再获取它的枚举器有什么意义。
关于c# - 在 Unity3d 中使用 IEnumerator 与 IEnumerable 的嵌套协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985022/