1. 程式人生 > >Unity中的協同程式

Unity中的協同程式

          小白歡迎評論,共同探討,共同進步奮鬥

協程的概念

     協程是一個分部執行,遇到條件(yield return語句)會掛起,直到條件滿足才會被喚醒繼續執行後面的程式碼。

Unity在每一幀都會去處理物件上的協程。主要是在Update後去處理協程(檢查協程的條件是否滿足)。

     協程跟Update()其實一樣的,都是Unity每幀都會去處理函式。如果在一個物件的前期呼叫協程,協程會立即執行到第一個

yield return語句處,如果是yield return null,就會在同一幀再次被喚醒。

協程的寫法

       Unity的協程系統是基於C#的一個簡單而強大的介面 ,

IEnumerator,它允許你為自己的集合型別編寫列舉器。也就是一個

IEnumerator 返回值,一個yield return null的語句。

//帶引數的:

IEnumerator Test01() 
{                        

          // 協程中必須有返回值yield return
          yield return null;
}

//帶引數的:

IEnumerator  Test02(string name)

{
         print (name);
         yield return null;
}

*協程中的細節*
        1.協程與普通方法一樣,可以被多次呼叫,


        2.協程一旦被開啟之後,總是試圖將方法中的程式碼執行完,之後停止。
        3.在協程內,如果遇到yield return null ,0 , 1 ...;表示剩餘程式碼將在下一幀繼續執行,
        4.在協程中遇到 yield return new WaitForSeconds (n);程式碼;表示剩餘程式碼將在 n秒之後執行。
        5. 在協程中如果遇到 yield return StartCoroutine (Son ()),表示剩餘程式碼將在子協程執行完成之後繼續執行。子協程仍然滿足協程基本規則。
        6.在協程中如果遇到 yield return new WaitForFixedUpdate (),
表示剩餘程式碼將在FixedUpdate執行完畢之後繼續向下執行。
        7. 在協程中如果遇到 yield return new WaitForEndOfFrame (),表示剩餘程式碼將在ONGUI執行完畢之後繼續向下執行。
        8.在協程中如果遇到 yield return WWW,表示剩餘程式碼將在www 下載檔案之後繼續向下執行。
        9.在協程中如果遇到  yield return obj ,表示剩餘程式碼將在obj不為空的時候繼續向下執行。
       10.在協程中如果遇到  yield return new WaitForSeconds (n) ,會受到Time.timeScale的影響。
       11.協程方法,可以當做普通方法,在兩個指令碼之間自由呼叫。
       12. 生命週期內的方法,也可以改造成協程方法。

        熟練使用協程,可以減少我們寫多個計時器,同時使程式碼也更加整潔,但錯誤使用協程,就會帶來N多個Bug等著我們解決。

記得寫上一個練習專案時遇到一個協程方面的坑,一開始我把協程當成一個普通函數了,不知道有木有童鞋和我犯一樣的錯誤,哈哈,結果放在Update裡面就導致了Unity直接崩盤。。。

C#中的協程是本身就是一個迭代函式,類似於Update,While函式。故把它放進Update或者While true 死迴圈中就直接導致Unity崩潰。

        它是一種偽多執行緒,並不是真正的多執行緒。協程還需要手動關閉。除非指令碼掛載的物件銷燬,不然還是開啟的。保持手動關閉的習慣是不錯的,協程開太多了也會影響系統效率。

StopAllCoroutines  停止執行此behaviour上的所有協同程式。

StopCoroutine  停止協同程式。

相關函式可以在Unity聖典看詳細的介紹。