[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-coroutine-的運行方式 有興趣也可以看看

在Unity裡可以用 StartCoroutine + IEnumerator 來實現這個作法。
而甚麼是StartCoroutine呢?
依據官網的解釋

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

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

結果2 :
當有兩個的時候亦然,先跑過CoroutineTest1、CoroutineTest2,遇見yield的時候暫時跳出,印出"Start2",第2幀開始執行CoroutineTest1、CoroutineTest2的WaitForSecond,並於設定的時間進行打印。
範例3 : 如下圖就是運用 StartCoroutine()來分階段管理遊戲流程
特別注意
使用上唯一需要注意的是
StartCoroutine() 呼叫的Function不能用一般的 Void Function()寫法。
需要改成 IEnumerator Function()。
同時IEnumerator Function()需要加入 yield return通知 StartCoroutine 跳回主線程才能達到多線程的目的。
進階運用:
IEnumerator Function()也可以加入While loop讓功能在目標循環內一再的重複,藉此達到某些流程管理的目的。

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