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

wquod 发布于 2019-03-09 c# 最后更新 2019-03-09 14:41 0 浏览

我有以下代码...

StartCoroutine(GetSuggestions());
IEnumerator GetSuggestions() {
    longExecutionFunction(); // this takes a long time
    yield return null;
}
我如何使用协程来保持主程序流?当前它到达longExecutionFunction();该程序停止几秒钟。如果整个程序在这个过程中继续工作,我希望它。我怎样才能做到这一点?
已邀请:

kodit

赞同来自:

您需要在另一个线程中启动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();
如果您不熟悉线程,则应在使用它们之前阅读它们。 :)

mid

赞同来自:

你应该使用Threads和一个协程。

StartCoroutine(MyCoroutine());
[...]
IEnumerator MyCoroutine()
{
    Thread thread = new Thread(() =>
    {
        longExecutionFunction();
    });
thread.Start();
while (thread.IsAlive) yield return 0;
// ... Use data here
}
但是,您不能在longExecutionFunction中使用任何unity对象或方法,因为unity不是线程安全的。因此,您需要计算longExecutionFunction中的所有数据,并在方法返回时初始化unity对象。

ad_est

赞同来自:

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