[Unity]多線程Unity StartCoroutine 和 yield return 的用法

在編寫遊戲的時候我們常會遇到需要同步進行的腳本,而我們知道CODE會一條一條的往下跑,我們除了使用WiatForSecond硬寫,強制程式在某個時間點做某件事外,是否還有其他的寫法呢?


在Unity裡可以用 StartCoroutine + IEnumerator 來實現這個作法。

而甚麼是StartCoroutine呢?

依據官網的解釋

這個句型可以在任何時候以yield暫時跳出執行序,並在下一幀自動恢復,並繼續等到協程執行完畢或條件成功下再回到執行序,藉此達到多線程的效果。



範例 :


結果:

我們可以看作
當Code進入CoroutineTest的時候,遇到yield回到主線程,於下一的時候則繼續回來執行CoroutineTest剩餘的部分(開始執行WaitForSecond條件,並於條件完成後顯示log)。

範例 2:

結果2 :

當有兩個的時候亦然,先跑過CoroutineTest1、CoroutineTest2,遇見yield的時候暫時跳出,印出"Start2",第2幀開始執行CoroutineTest1、CoroutineTest2的WaitForSecond,並於設定的時間進行打印。





StartCoroutine()不見得只能用return new WaitForSecond來跑,也可以用複合條件式跑,甚至在一個StartCoroutine()下也可以有其他的StartCoroutine()

範例3 :
如下圖就是運用 StartCoroutine()來分階段管理遊戲流程



特別注意

使用上唯一需要注意的是
StartCoroutine() 呼叫的Function不能用一般的 Void Function()寫法。
需要改成 IEnumerator Function()

同時IEnumerator Function()需要加入 yield return通知 StartCoroutine 跳回主線程才能達到多線程的目的。


進階運用:

IEnumerator Function()也可以加入While loop讓功能在目標循環內一再的重複,藉此達到某些流程管理的目的。




中斷協程

Unity也有StopCoroutine可以暫停/中斷協程。
詳細可參考官網
MonoBehaviour .StopCoroutine

這邊也有找到其他網友寫的 淺談-unity-coroutine-的運行方式 有興趣也可以看看




留言

熱門文章