unity 協程實現

c#實現的協程樣例代碼: https://gist.github.com/liyonghelpme/87754c95e4a2d4e1f4c9git

c#迭代器和Unity協程

c# 自己支持迭代器IEnumerator,能夠封裝函數的執行上下文,可是迭代器不支持嵌套迭代,而爲了實現帶堆棧支持的協程,須要對c#作擴展。github

Unity 中協程的嵌套形式以下: yield return StartCoroutine(IEnumerator);c#

爲了嵌套協程須要保存協程調用的堆棧信息,而且在IEnumerator結束的時候,繼續執行上一層的IEnumerator.函數

所以Unity 封裝了一個類Coroutine, 該類中保存有當前IEnumerator 等待的下一級IEnumerator(waitingFor) 以及噹噹前IEnumerator 執行結束的時候所要調用的上一級IEnumerator(ContinueWhenFinished).協程

這樣協程的執行流程以下:

  1. 調用Unity StartCoroutine 接口對象

  2. Unity 建立一個 Coroutine 協程對象, 並初始化協程中的迭代器接口

  3. Unity 合適時機調用 協程中迭代器的 moveNext 方法生命週期

    這時候 Unity獲取迭代器的Current 返回值;若是返回值爲NULL 則Unity將對迭代器的執行加入到下一幀的循環中,不然根據返回值不一樣作不一樣的處理。隊列

    若是返回值是一個new WaitForSeconds() 對象則將將協程加入到延遲迴調隊列裏面;事件

    若是返回值是另一個協程對象,則設置當前協程的waitFor 爲這個新協程對象,而且設置新協程對象的ContinueWhenFinish 爲當前協程。

協程建立

Unity 提供 StartCoroutine 接口用於建立一個協程, 建立完協程以後,將會調用協程Run接口,執行一下協程,若返回NULL,則將協程加入到下一幀執行隊列中,不然根據狀況來作不一樣的調度。

協程執行

在初始化StartCoroutine 的時候會執行一次協程;以後根據協程執行的返回結果,來作不一樣的調度; 返回NULL 調度下一幀繼續執行;

返回另一個協程對象,則配置兩個協程的關係,同時中止調度當前協程,將子協程加入到調度隊列裏面;

返回Wait 則將當前協程加入到等待調度隊列裏面。

協程銷燬

協程生命週期和Monobehavior 相綁定,當GameObject SetActive False的時候,全部協程都會中止。

在建立協程的時候,若協程將會加入到 Monobehavior的ActiveCoroutine 活躍協程列表中,接着執行一次協程;若協程本次執行完以後沒有yield調用,則表示協程生命週期結束,以後調用的協程清理函數會清理掉協程。

不然協程會加入到延遲調用隊列中。

當協程須要等待其它事件,或者其它協程的時候,協程引用計數+1,這樣協程會在其它事件執行完以後,才檢測是否執行清理工做。

相關文章
相關標籤/搜索