1. 程式人生 > 實用技巧 >[Unity]協同程式(Coroutine)的基礎應用

[Unity]協同程式(Coroutine)的基礎應用

在之前的foreach原理中有提到過yield return的結合使用;yield關鍵字就是屬於協程的內容,這篇隨筆記錄一下協程的內容:

定義:

具有多個返回點(yield),可以在特定時機分步執行的函式。

原理:

Unity每幀處理GameObject中的協同函式,直到函式執行完畢。

當一個協同函式啟動時,本質建立迭代器物件;呼叫MoveNext方法,執行到yield暫時退出;待滿足條件後再次呼叫MoveNext方法,執行後續程式碼,直至遇見下一個yield為止,如此迴圈至整個函式結束。

語法:

通過MonoBehaviour中的StarCoroutine方法啟動,StopCoroutine

方法停止。

協程函式返回值型別為IEnumerator,方法體中通過yield關鍵字定義返回點,通過return XX物件定義繼續執行的條件。

可以被yield return的物件:

  1. null或數字 -- Update後執行,適合分解耗時的邏輯處理。
  2. WaitForFixedUpdate -- FixedUpdate後執行,適合分解物理操作。
  3. WaitForSeconds -- 在指定時間後執行,適合延遲呼叫。

WaitForSecondsRealtime -- 同上,不受時間縮放影響。

   4.WaitForEndOfFrame -- 在每幀結束後執行,適合相機的跟隨操作。

   5.Coroutine -- 在另一個協程執行完畢後再執行。

   6.WaitUntil -- 在委託返回true時執行,適合等待某一操作。

    WaitWhile -- 在委託返回false時執行,適合等待某一操作。

   7.WWW -- 在請求結束後執行,適合載入資料,如檔案、貼圖、材質等。

作用:

  1. 延時呼叫,很好理解。
  2. 分解呼叫,可用於物體淡出,顏色漸變等。

簡單做一段Cube顏色淡入的程式碼演示:

使用程式碼控制Cube的材質球,使其Colora值從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)