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迭代器

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