做Unity專案用協程用了段時間,在完全黑盒的情況下摸索出了一些協程的性質,寫篇文記錄一下,
- 要啟動一個協程,需要呼叫
StartCoroutine()函式,這個函式只有一個引數,型別為IEnumerator,即以一個迭代器為引數, - 直接將容器的迭代器傳給
StartCoroutine()暫時沒有認識到有什么用處, - Unity的協程主要利用的是C#的一個語法糖:回傳值為
IEnumerator的函式會直接回傳一個迭代器,每一次呼叫迭代器的MoveNext方法時,函式只會執行到遇到的第一個yield return處,并在下一次呼叫MoveNext的時候從這個yield return開始執行,直到往后碰到yield return或者到函式結束再跳出函式, yield return可以回傳null,也可以回傳一個協程,回傳null時會在下一幀中直接再次進入協程函式;回傳協程時會等待這個協程執行完畢再繼續執行,因此可以把小的協程連成一個大協程,讓一些影片效果順序執行:
IEnumerator Combine()
{
yield return Anim1();
yield return Anim2();
yield return Anim3();
// ...
yield return AnimN();
}
- 因此根據上述描述,我們可以把Update函式放到一個協程中,其運行規律和MonoBehavior的Update應該是一致的:
void Start()
{
StartCoroutine(UpdateRunner());
}
IEnumerator UpdateRunner()
{
while (true)
{
MyUpdate();
yield return null;
}
}
void MyUpdate()
{
}
- 協程的本質是狀態機的語法糖,所以協程并非必需,但是妥善運用好協程可以減少代碼量,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273603.html
標籤:其他
上一篇:寫一個猜數字的游戲
