2

我在 Unity 工作,我有一个很大的脚本。在脚本中的某个点,foo将启动一个协程。我希望这个协程运行另一个IEnumerator函数,bar但我不想bar从协程开始。相反,我需要foo开始运行,可能会 yield 几次,调用bar,等到 bar 完成运行,然后继续运行。目前我不得不bar IEnumerable做:

void Start () {
    StartCoroutine(foo());
}

IEnumerator foo () {
    //Do something up here
    foreach (int x in bar()) {
        yield return null; //Wait for bar to yield break
    }
    //Do more stuff down here
    yield break;
}


IEnumerable bar () {
    for (int x=0; x < 5; x++) {
        //Do Something 5 Times
        yield return x;
    }
    yield break;    
}

我一直在寻找,但我找不到正确的方法来做到这一点。当然会有超过 10 个这样的“bar”函数,所以我不想每次我想调用一个时都必须创建一个 for 循环。我怎样才能IEnuerator以这种方式调用其他函数?

4

2 回答 2

2

您正在寻找的是通常称为yield foreach. 这是一个不存在的功能(尽管经常被请求)。你几乎被迫做你正在做的事情。

当您编写一个迭代器块并且您希望产生其他IEnumerableIEnumerator单独的每个项目时,您别无选择,只能显式枚举序列并产生每个项目。如果你能写出类似yield foreach Bar()但你不能写的东西,那就太好了。您现有的解决方案与使用当前语言功能一样好。

于 2013-08-21T17:57:41.677 回答
0

像这样的东西怎么样:

class Program
{
    public class CoroutineThing
    {
        public IEnumerator foo()
        {
            //Do something up here
            var nTimesInvoked = 0;
            while (bar(nTimesInvoked++))
                yield return null; //Wait for bar to yield break
            //Do more stuff down here
            yield break;
        }
        bool bar(int nTimesInvoked)
        {
            if (nTimesInvoked < 5)
            {
                Console.WriteLine("Bar: {0}", nTimesInvoked);
                // Do something;
            }
            return nTimesInvoked < 4;
        }
    }
    public static void Main(params string[] args)
    {
        var cor = new CoroutineThing();
        var nFoo = 0;
        var e = cor.foo();
        while (e.MoveNext())
        {
            nFoo++;
            Console.WriteLine("{0} times foo", nFoo);
        }
        Console.ReadLine();
    }
}
于 2013-08-21T17:42:13.310 回答