[Unity]協同程式(Coroutine)的基礎應用
在之前的foreach原理中有提到過yield return的結合使用;yield關鍵字就是屬於協程的內容,這篇隨筆記錄一下協程的內容:
定義:
具有多個返回點(yield),可以在特定時機分步執行的函式。
原理:
Unity每幀處理GameObject中的協同函式,直到函式執行完畢。
當一個協同函式啟動時,本質建立迭代器物件;呼叫MoveNext方法,執行到yield暫時退出;待滿足條件後再次呼叫MoveNext方法,執行後續程式碼,直至遇見下一個yield為止,如此迴圈至整個函式結束。
語法:
通過MonoBehaviour中的StarCoroutine方法啟動,StopCoroutine
協程函式返回值型別為IEnumerator,方法體中通過yield關鍵字定義返回點,通過return XX物件定義繼續執行的條件。
可以被yield return的物件:
- null或數字 -- 在Update後執行,適合分解耗時的邏輯處理。
- WaitForFixedUpdate -- 在FixedUpdate後執行,適合分解物理操作。
- WaitForSeconds -- 在指定時間後執行,適合延遲呼叫。
WaitForSecondsRealtime -- 同上,不受時間縮放影響。
4.WaitForEndOfFrame -- 在每幀結束後執行,適合相機的跟隨操作。
5.Coroutine -- 在另一個協程執行完畢後再執行。
6.WaitUntil -- 在委託返回true時執行,適合等待某一操作。
WaitWhile -- 在委託返回false時執行,適合等待某一操作。
7.WWW -- 在請求結束後執行,適合載入資料,如檔案、貼圖、材質等。
作用:
- 延時呼叫,很好理解。
- 分解呼叫,可用於物體淡出,顏色漸變等。
簡單做一段Cube顏色淡入的程式碼演示:
使用程式碼控制Cube的材質球,使其Color的a值從0勻速提升到255.
public class CoroutineTest : MonoBehaviour { public GameObject cube;public Material cubeMaterial; public float fadeSpeed = 0.2f;//大慨五秒淡入完成 private Color colorTemp; // Start is called before the first frame update void Start() { cubeMaterial = cube.GetComponent<Renderer>().material; colorTemp = cubeMaterial.color; colorTemp.a = 0; StartCoroutine(FadeIn()); } private IEnumerator FadeIn() { while (colorTemp.a <= 1) { cubeMaterial.color = colorTemp; colorTemp.a += fadeSpeed * Time.deltaTime; yield return null; } } }
做個小擴充套件,既然做了勻速漸變,當然也可以做個變速的漸變,此時可以用AnimationCurve來實現(動畫曲線AnimationCurve可以提供數值視覺化的操作面板):
public class CoroutineTest : MonoBehaviour { public GameObject cube; public Material cubeMaterial; public float fadeSpeed = 0.2f;//大概五秒淡入完成 private Color colorTemp; //變速漸變 public AnimationCurve aniCurve; private float time; // Start is called before the first frame update void Start() { cubeMaterial = cube.GetComponent<Renderer>().material; colorTemp = cubeMaterial.color; colorTemp.a = 0; time = 0; StartCoroutine(FadeIn()); } //變速漸變 private IEnumerator FadeIn() { while (colorTemp.a <= 1) { time += Time.deltaTime; cubeMaterial.color = colorTemp; colorTemp.a = aniCurve.Evaluate(time * fadeSpeed); yield return null; } } }
其中AnimationCurve.Evaluate()用來獲取引數值x對應的y值,比如該曲線:
此時AnimationCurve.Evaluate(0.5)的返回值為0.25
如果想做比如紅色到藍色的變化,可以加入Color.Lerp(Color a,Color b,float t)。