c# Unity试图弄清楚如何使用协程
本文关键字:何使用 弄清楚 Unity | 更新日期: 2023-09-27 18:08:36
我有以下代码…
StartCoroutine(GetSuggestions());
IEnumerator GetSuggestions() {
longExecutionFunction(); // this takes a long time
yield return null;
}
如何使用协程来保持主程序流的运行?当前当它到达longExecutionFunction()时;程序停止几秒钟。我希望在这个过程中整个程序能继续工作。我该怎么做呢?
不使用线程,假设您可以修改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
中的所有数据,并在方法返回时初始化统一对象。