嵌套协同程序在Unity3d中使用IEnumerator与IEnumerable

时间:2014-01-08 00:50:05

标签: 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 . . .
}

我发现这种方法比拥有多个StartCoroutine产生更少的垃圾(这在Unity中可能是一个问题);因此它非常有用,特别是在处理许多嵌套层时。

现在我的问题是:

而不是使用IEnumerable InnerCoroutine(){}并获得如下的枚举器:

IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator(); 

我想使用IEnumerator InnerCoroutine(){}并获取这样的枚举器:

IEnumerator innerCoroutineEnumerator = InnerCoroutine();

他们是一样的吗?

除了在我的测试中更快,这个方法还允许我通过正常的StartCoroutine方法使用“内部协同程序”方法,这可能会在路上发挥作用。

我已经完成了测试,据我所知,两种技术都有效地做同样的事情,但我在这整个编码事情上仍然相对较新,所以我有可能错过了一些东西。

1 个答案:

答案 0 :(得分:1)

实际上,两种写作方式都会产生相同的结果。

这更像是一个C#问题,Unity3D只是在他们的协程系统中使用这些类型。您可能会发现this post answering in more details您的问题。

但是,我不确定你的意思

  

我发现这种方法产生的垃圾更少(这在Unity中可能是一个问题)

因为两种方法都应该产生相同的结果。在这一点上,它更多的是代码风格的选择。

我个人更喜欢StartCoroutine(InnerCoroutine())一个班轮,其中InnerCoroutine()会返回IEnumerator。我没有看到为InnerCoroutine()返回IEnumerable并随后获取其枚举器的重点。