c# Unity试图弄清楚如何使用协程

本文关键字:何使用 弄清楚 Unity | 更新日期: 2023-09-27 18:08:36

我有以下代码…

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

如何使用协程来保持主程序流的运行?当前当它到达longExecutionFunction()时;程序停止几秒钟。我希望在这个过程中整个程序能继续工作。我该怎么做呢?

c# Unity试图弄清楚如何使用协程

不使用线程,假设您可以修改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中的工作取决于其中的代码。

您需要在另一个线程中启动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();

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

应该将线程与协程结合使用。

StartCoroutine(MyCoroutine());
[...]
IEnumerator MyCoroutine()
{
    Thread thread = new Thread(() =>
    {
        longExecutionFunction();
    });
    thread.Start();
    while (thread.IsAlive) yield return 0;
    // ... Use data here
}

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