• 您的位置:首頁 > 新聞動態 > Unity3D

    unity3d中協程Coroutine的的原理及使用

    2019/1/9      點擊:

    我們學習下(xià)unity3d中協程(chéng)Coroutine的的原理及使用

    1.什麽是協調程序

    unity協程(chéng)是一個(gè)能暫停執(zhí)行(háng),暫停後立即返回,直到中斷指令完成後繼續執行的函數。

    它(tā)類(lèi)似(sì)一個子線程單獨出來處(chù)理一些問題,性能開銷較小,但是他(tā)在一個MonoBehaviour提供的主線程裏隻能有一個處於運行狀態(tài)的協程。

    2.協同程序的特點

    1、協程在中斷指令(YieldInstruction)產生時暫停執行

    2、協(xié)程一暫停執行便立即返回 //中斷協程後返(fǎn)回主函數,暫停結束(shù)後繼續執行協程剩餘的函數。

    3、中(zhōng)斷(duàn)指令完成後從中斷指令(lìng)的下一行繼續執行

    4、同一時刻、一個腳本實例中可以有多個暫停(tíng)的協(xié)程,但隻有(yǒu)一個運行著(zhe)的協程

    5、函數體全部執行完後,協程結束

    6、協程可以很(hěn)好的控製跨越一(yī)定幀數後執行的行為

    7、協程在性能上、相比於一(yī)般函數幾(jǐ)乎沒有更多的開銷

    3.創建一個協程函數(shù)

    注意:

    協同函數的(de)返回值的類型必須是Coroutine,Coroutine繼承與Yieldinstruction。

    所以(yǐ)協同程(chéng)序的返(fǎn)回(huí)類型就隻能是null,等待的時間,等待(dài)的幀數。。由此可(kě)見WWW 也是實現了Coroutine的~

    4.開始一個協同程(chéng)序

    通過MonoBehaviour提供的StartCoroutine方法來實現啟動協同程(chéng)序(xù)。

    1、StartCoroutine(IEnumerator routine);

    優(yōu)點:靈活,性能開銷小。

    缺點:無法單獨的停止這個協程,如果需要停止這個協程隻能等待協同程序運行完畢或則使用StopAllCoroutine();方法。

    2、StartCoroutine (methodName:string, value : object = null);

    優點:可以直接通過傳入協同程序的(de)方法名來停止這個協程:StopCoroutine(string methodName);

    缺點:性能的開(kāi)銷較大,隻能傳遞一(yī)個參數。

    5.停止協同程序

    1、StopCoroutine(string methodName);

    2、StopAllCoroutine();

    3、設置gameobject的active為false時可以終止協同程序(xù),但是再次設置為(wéi)true後協程不會再啟動。

    6.協同程序的執行順序

    開始協同程序 -> 執(zhí)行協(xié)同程序 -> 中斷協同程序(中斷指令)-> 返回上層繼續執行

    ->中(zhōng)斷指令結束後繼續執行協同程序剩下的內容

    7.協同程序的注意事項

    1、不能再Update或者FixUpdate方法中使用協同程序,否則會報錯。

    2、關於中斷指令:

    中斷指令/YieldInstruction,一個協程收(shōu)到中斷指令後暫停執行,返回上層執行同時等待這個指令達成後繼(jì)續執行(háng)。


      指令                      描(miáo)述                          實現

    WaitForSeconds          等待指定秒數            yield return new WaitForSeconds(2);

    WaitForFixedUpdate      等待一個固定幀          yield return new WaitForFixedUpdate();

    WaitForEndOfFrame       等待幀結束              yield return new WaitForEndOfFrame();                         

    StartCoroutine          等待一個新(xīn)協程暫停      yield return StartCoroutine(other coroutine);

    WWW                     等待一個加載完成        yield return www;

    注意:

    1、一個協程A裏(lǐ)在中斷指令裏再啟動一個(gè)協程B,在yield return StartCoroutine時執行的順序是:

    ①:先執行新協程B;

    ②:新協程B暫停後向上返回協程(chéng)A,A協(xié)程暫停,返回協程A的上層函數;

    ③:因(yīn)為(wéi)決定協程A是否結束的標誌是新協程B是(shì)否結束,所以當(dāng)新協程B結束後返回協程A繼(jì)續執行餘(yú)下的內容;

    ④:協程A執行結束。

    2、關於WWW的中斷指令可參考API:

    You can inspect the isDone property to see if the download has completed or yield the download object to automatically wait until it is (without blocking the rest of the game).

    你可以(yǐ)檢查isDone屬性來查看是否已經下載(zǎi)完成,或者yield自動等待(dài)下載物體,

    直到它被下載完成(不會影響遊戲的其餘部分)。

    3、協同程序的中斷返(fǎn)回機製也可用於指定時間間(jiān)隔執行一個(gè)程序:

    91影视免费版下载-91麻豆国产福利精品-91麻豆精品一二三区在线-国产91系列视频在线观看