C#Unity试图弄清楚如何使用Coroutine

时间:2013-04-11 16:41:53

标签: c# unity3d coroutine

我有以下代码......

StartCoroutine(GetSuggestions());

IEnumerator GetSuggestions() {
    longExecutionFunction(); // this takes a long time
    yield return null;
}

如何使用协程来保持主程序的流程?目前它到达longExecutionFunction();程序停止几秒钟。如果整个程序在这个过程中继续工作,我会喜欢它。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

不使用线程,假设您可以修改longExecutionFunction,它看起来像这样:

void longExecutionFunction()
{
    mediumExecutionFunction();
    mediumExecutionFunction();
    while(working)
    {
        mediumExecutionFunction();
    }
}

您可以将其修改为:

IEnumerator longExecutionFunction()
{
    mediumExecutionFunction();
    yield return null;
    mediumExecutionFunction();
    yield return null;
    while(working)
    {
        mediumExecutionFunction();
        yield return null;
    }
}

然后修改调用代码:

StartCoroutine(GetSuggestions());

IEnumerator GetSuggestions() {
    yield return longExecutionFunction();
    //all done!
}

然后,每次更新都会做一个“中等长度的东西”,让游戏不再挂起。如果你在longExecutionFunction内分解工作有多精细,取决于你的代码。

答案 1 :(得分:0)

您需要在另一个线程中启动longExecutionFunction。您可能需要查看本文以了解线程:http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

代码示例:

var thread = new System.Threading.Thread(new System.Threading.ThreadStart(() => {
    longExecutionFunction();
}));
thread.Start();

如果您不熟悉线程,则应在使用它们之前阅读它们。 :)

答案 2 :(得分:0)

您应该将Threads与协程结合使用。

StartCoroutine(MyCoroutine());

[...]

IEnumerator MyCoroutine()
{
    Thread thread = new Thread(() =>
    {
        longExecutionFunction();
    });

    thread.Start();

    while (thread.IsAlive) yield return 0;

    // ... Use data here
}

但是你不能在longExecutionFunction内使用任何统一对象或方法,因为统一不是线程安全的。因此,您需要在longExecutionFunction内计算所有数据,并在方法返回时初始化unity对象。