Unity3D的協程歸納地將就是:對於一段程序,你能夠加上yield標明哪裏須要暫停,而後在下一幀或者一段時間後,系統會繼續執行這段代碼。協程的做用:①延遲一段時間執行代碼。②等某個操做完成以後再執行以後的操做。異步
總結起來就是一句話:控制一段代碼在特定的時機執行。async
Unity3D協程的核心在於「yield return"命令,這句代碼的意義是立刻中止當前函數,而後在下一幀中從這裏從新開始。舉個例子:函數
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CoroutineCountdown : MonoBehaviour { public float floattimer; public float timer; void Start() { StartCoroutine(Countdown()); } IEnumerator Countdown() { int seconds = 0; while (true) { //timer累加到1時,至關於運行了1秒後,會timer大於1,不會執行yield return 0,而結束循環 //接着執行second++;second經過log對用戶可見,隨着程序執行,每過1秒輸出累加時間值1,2,3。。。 for (float timer = 0; timer < 1;) { yield return 0; timer += Time.deltaTime; } seconds++; Debug.Log(seconds + " seconds have passed since the Coroutine started."); } } }
在timer知足循環條件,即timer小於1時,會執行yield return 0,這時候會中止countdown函數,而後在下一幀中從新從yield處開始執行;因此在進入下一幀時會先在運行一次yield return 0語句,而後是timer+=Time.deltaTime,當timer大於1時,這時候不知足循環的判斷條件,這時候會結束循環。接着運行下一行代碼:second++,對Second累加1,並輸出Log信息。spa
在Console窗口中會輸出log信息,可見Second每秒累加1次。其實每次輸出log信息時,線程
另外注意,結束一個協程須要使用協程函數的字符串形式:StopCoroutine("Countdown");
code
協程是 Unity 3D的一種官方的加載方式,好處是能讓代碼看起來更「同步」(sync)一些。協程不是線程,也不是異步執行(async)的。協程和 MonoBehaviour 的 Update函數同樣也是在MainThread中執行的。使用協程你不用考慮同步和鎖的問題。資源在 yield 返回後便可使用,代碼比回調的方式容易組織。協程