c# - 在 Unity3d 中使用 IEnumerator 与 IEnumerable 的嵌套协程

标签 c# iterator unity3d coroutine

我正在使用 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/

相关文章:

java - 没有打印两次?

c# - 转换请求。

c# - 如何在 C# 中将连续日期范围列表切入财政年度列表?

c# - 页面没有显示,因为IIS上的请求实体太大

C#:帮助理解 UML 类图中的 <<property>>

c# - 为什么 Iterator 定义 remove() 操作?

java - arraylist并发修改

xcode - 根据韩国的开发人员设置配置,不允许用户查看应用程序?

c# - 如何使用 float.Parse 从 "5/2"等字符串中获取小数

ios - 如何更新/升级 Facebook API 版本?