Unity5中的Coroutine和yield return

一、Coroutine(協同程序)

Coroutine,就是在主程序運行的同時開啓另一個線程,來協同當前程序的執行。在一般規模較大的遊戲中常常需要使用協程,這樣的好處是——協程在協調在幾幀中執行的操作時有極大的用處,因爲協程幾乎無性能開銷。

一般來說,我們有兩種方法來開啓一個線程,StartCoroutine(string Name)和StartCoroutine(IEnumerator Routine)。

前者可以開啓線程並在線程結束前終止線程,而後者只能等待線程的結束而不能隨時終止;另外使用StartCoroutine(string Name)時,開啓線程時最多隻能傳遞一個參數,與此同時性能消耗也會增大;而使用StartCoroutine(IEnumerator Routine)則沒有這個限制。

而關閉協程也有兩種方法,StopCoroutine(string Name)和StopAllCoroutines()。但是後者是用來終止所有Coroutine,這裏使用時需要注意。

二、Yield return(Coroutine中返回調用迭代語句)

在協程中,必須需要Yield return來返回值,而yield return的值決定了什麼時候使該協程恢復執行。yield return 後面可以接幾種值:

  1. yield return + “int類型的值”。指當前暫停一幀,從下一幀繼續開始執行。
  2. yield return + “協程”。yield return 後面可以跟一個協程,當執行到該行代碼的時候執行其後面的協程,如果下面還有代碼在執行完yield return 後面的協程時候,回來繼續執行。例如:yield return StartCoroutine(xxx());
  3. yield return new WaitForSeconds(時間)。這主要是等待幾秒鐘後執行再yield return 後面的代碼。
  4. yield return + “自定義的類”。

三、關於多個Coroutine的執行順序

話不多說,我們先上代碼看看:

void Start () {
            Debug.Log("x1");
            StartCoroutine(Test());
            Debug.Log("x2");
        }
    
       IEnumerator Test()
        {
            Debug.Log("y1");
            yield return new WaitForSeconds(5);//等待5s後再進行調用返回
            Debug.Log("y2");
        }

這裏的執行結果:x1 -> y1 -> x2 -> y2 ,y2是等待5s後才執行出來的結果。

如果這裏能理解的話,我們再看看稍微難一點的:

void Start () {
        Debug.Log("a1");
        StartCoroutine(First());
        Debug.Log("a2");
    }

   IEnumerator First()
    {
        Debug.Log("b1");
        yield return StartCoroutine(Second());
        Debug.Log("b2");
    }
    
   IEnumerator Second()
    {
        Debug.Log("c1");
        yield return null;
        Debug.Log("c2");
    }

這裏的執行結果:a1 -> b1 -> c1 -> a2 -> c2 -> b2

原因:這種StartCoroutine中嵌套一個yield return StartCoroutine,此時有兩個Coroutine存在;那麼First()會等到Second()中所有代碼執行完畢後再繼續執行,而Second()中的yield語句會先返回到First(),然後立即返回到First()的調用處,也就是Start ()會繼續執行,Start ()執行完畢後會跳回到Second()進行執行,這是最先發出“返回調用”的地方,而First()會等待Second()執行完再繼續執行。

好了,Unity中的Coroutine和yield return基本功能大概就這些,如果想更深入理解的話建議大家到Unity官網中查看對應的官方解釋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章