我在Unity工作,我有一个大脚本。在脚本的某个时刻,将启动协程foo
。我希望这个协程能够运行另一个IEnumerator
函数bar
,但我不希望bar
作为协同程序启动。相反,我需要foo
开始运行,可能会产生几次,调用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个这样的&#34; bar&#34;函数,所以我不想每次想要调用一个for循环。如何以这种方式调用其他IEnuerator
函数?
答案 0 :(得分:1)
您正在寻找的是经常被称为yield foreach
的东西。这是一个不存在的功能(尽管经常被要求)。你几乎被迫完成你在这里做的事情。
当您编写迭代器块并且希望单独生成其他IEnumerable
或IEnumerator
的每个项目时,您别无选择,只能明确枚举序列并生成每个项目。如果你能写出像yield foreach Bar()
这样的东西,那就太好了。您现有的解决方案与使用当前语言功能一样好。
答案 1 :(得分: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();
}
}