Unity 2018中使用Async-Await替代 coroutines

在Unity中使用协程通常是解决某些问题的好方法,但是它也具有某些缺点:

协程不能返回值。这鼓励程序员创建巨大的整体协程方法,而不是用许多较小的方法组成它们。存在一些变通办法,例如将Action <>类型的回调参数传递给协程,或在协程完成后强制转换从协程产生的最终未类型化值,但是这些方法使用起来很麻烦并且容易出错。
协程使错误处理变得困难。您不能将yield放入try-catch中,因此无法处理异常。另外,当确实发生异常时,堆栈跟踪只会告诉您协程在何处抛出了异常,因此您必须猜测可能从哪个协程中调用了该协程。
随着Unity 2017的发布,现在可以代替异步方法使用称为async-await的新C#功能了。与协程相比,它具有许多不错的功能。

要启用此功能,您需要做的就是打开播放器设置(“编辑”->“项目设置”->“播放器”),并将“脚本运行时版本”更改为“实验性(.NET 4.6等效)”。

让我们看一个简单的例子。给出以下协程:

public class AsyncExample : MonoBehaviour
{
IEnumerator Start()
{
Debug.Log(“Waiting 1 second…”);
yield return new WaitForSeconds(1.0f);
Debug.Log(“Done!”);
}
}
使用async-await的等效方法如下:

public class AsyncExample : MonoBehaviour
{
async void Start()
{
Debug.Log(“Waiting 1 second…”);
await Task.Delay(TimeSpan.FromSeconds(1));
Debug.Log(“Done!”);
}
}
在这两种情况下,一定要了解引擎盖下正在发生的事情会很有帮助。

简而言之,Unity协程使用C#对迭代器块的内置支持来实现。您提供给StartCoroutine方法的IEnumerator迭代器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章