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

    2019/1/9      點擊:

    我們(men)學習下unity3d中協程Coroutine的的原理及使用

    1.什麽是協(xié)調程(chéng)序

    unity協程是一個能暫停執行,暫停後(hòu)立即返回,直到(dào)中斷指令完成後繼續執行的函數。

    它類似一(yī)個子(zǐ)線程單獨出來(lái)處理一些問題,性能(néng)開銷較小,但是他在一個MonoBehaviour提供的主線程裏隻能有一個處於(yú)運行狀態的協程。

    2.協同程序的特點(diǎn)

    1、協(xié)程(chéng)在中斷(duàn)指令(YieldInstruction)產生時(shí)暫(zàn)停(tíng)執(zhí)行

    2、協程一暫停執行便立即(jí)返回 //中斷協程後返回主(zhǔ)函數(shù),暫停結束後繼(jì)續執行協程剩餘的函數。

    3、中斷指令完成後從中斷指令的下一行繼(jì)續執行

    4、同一時刻、一個腳本實例中可(kě)以有多個暫停的協程,但(dàn)隻有一個運行著的協程

    5、函數體(tǐ)全部執行完後(hòu),協程結束

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

    7、協程在性能上、相(xiàng)比於一般函數幾乎沒有(yǒu)更(gèng)多的開銷

    3.創建一個協程函數

    注(zhù)意:

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

    所以協(xié)同程序的(de)返回類型就隻能是null,等待的時間,等待的幀數。。由此可(kě)見WWW 也是實現了Coroutine的~

    4.開始一個協同程序

    通過MonoBehaviour提供的StartCoroutine方法來實現啟動協同程序。

    1、StartCoroutine(IEnumerator routine);

    優點:靈活,性能開銷小。

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

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

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

    缺點:性能的開銷(xiāo)較大,隻能傳遞一個參數。

    5.停止(zhǐ)協同程(chéng)序

    1、StopCoroutine(string methodName);

    2、StopAllCoroutine();

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

    6.協同程序的執行順序

    開始協同程序 -> 執(zhí)行協同程序 -> 中斷協同(tóng)程序(中斷指令)-> 返回上層繼(jì)續執行

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

    7.協同程序的注意事項

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

    2、關於中斷指令:

    中(zhōng)斷指令/YieldInstruction,一(yī)個協程(chéng)收到中斷指令後暫停執行,返回上層執行同時等待這(zhè)個指令達成後繼續執行(háng)。


      指令                      描述                          實現

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

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

    WaitForEndOfFrame       等待(dài)幀結(jié)束              yield return new WaitForEndOfFrame();                         

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

    WWW                     等(děng)待一個加載完成        yield return www;

    注意:

    1、一個協程(chéng)A裏在中斷指令裏再啟動(dòng)一個協程B,在yield return StartCoroutine時執(zhí)行的順序(xù)是:

    ①:先執(zhí)行新協程B;

    ②:新協程B暫停後向上返(fǎn)回協程A,A協程暫停,返回(huí)協程A的上層函數;

    ③:因為決定協程A是否結束(shù)的標誌是新協程B是否結束,所以當新協程B結(jié)束後返回(huí)協(xié)程A繼續執(zhí)行餘下的(de)內容;

    ④:協程A執(zhí)行結束。

    2、關(guān)於WWW的(de)中斷指令可參考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).

    你可以檢查(chá)isDone屬性來查(chá)看是否(fǒu)已經下載完成,或者(zhě)yield自動等待下載物體,

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

    3、協同程序的中斷返回(huí)機製也(yě)可(kě)用(yòng)於指定時間間隔執行一個(gè)程序:

    自愉色色,亚洲色孩,jk无遮拦,日日夜夜7799天天综合,999夜夜,7799天天综合天天综合网精品视频,日日夜夜精品视频7799,天天综合7799精品影视