unity3d中(zhōng)協程Coroutine的的原理及使用
我們(men)學習下unity3d中協(xié)程Coroutine的的原理及使用
1.什麽是協調程序
unity協程是一(yī)個能暫停執(zhí)行,暫停後立即返回,直到中斷(duàn)指令(lìng)完成後繼續(xù)執行的函數。
它類似一個子線程單獨出來處理一些問題,性能開銷較小,但是他在一個MonoBehaviour提(tí)供的主線程裏(lǐ)隻能有一個處於運行狀態的(de)協程(chéng)。
2.協同程序(xù)的特點
1、協程在中斷指令(YieldInstruction)產生時暫(zàn)停執行
2、協程一暫停執行便立即(jí)返回 //中(zhōng)斷協程後返回主函數,暫停結束後繼續執行協程剩餘的函數。
3、中斷指令完成後從中斷指令的下一行繼(jì)續執行
4、同一時刻、一個腳本(běn)實例中可(kě)以有多個暫停的(de)協程,但隻有一個運行著的協程(chéng)
5、函數體全(quán)部(bù)執行(háng)完後,協程結(jié)束
6、協程可以很好的(de)控製跨(kuà)越(yuè)一定幀數後執(zhí)行的行為
7、協程在性能上、相比(bǐ)於一般函數幾乎沒有更多的開(kāi)銷
3.創建一個協程函數
|
1
2
3
4
5
6
|
IEnumerator methodName(Object parameter1,Object parameter2,...){
// to do something
yield return YieldInstruction/other/null;
// to do something else
}
|
注意:
協同函數的返回值的類(lèi)型必須(xū)是Coroutine,Coroutine繼承(chéng)與Yieldinstruction。
所以協同程序(xù)的(de)返回類型就隻能是null,等待的時間(jiān),等待的幀數。。由此可見(jiàn)WWW 也是實現了Coroutine的~
4.開始一個協同程序
通過MonoBehaviour提供的StartCoroutine方法來(lái)實現啟動協同程序。
1、StartCoroutine(IEnumerator routine);
優點:靈活,性能開銷小。
缺點:無法(fǎ)單獨(dú)的停止這個(gè)協(xié)程,如果需要停止這個協程隻能等待協同程序運行(háng)完畢或則使用StopAllCoroutine();方法。
2、StartCoroutine (methodName:string, value : object = null);
優點:可以直接通過傳入協同程序的方(fāng)法名來停止這(zhè)個協程:StopCoroutine(string methodName);
缺點:性能的開銷較大,隻能傳遞一個參數。
5.停止協同程序
1、StopCoroutine(string methodName);
2、StopAllCoroutine();
3、設置gameobject的active為false時可以終止(zhǐ)協同程序,但是再次(cì)設(shè)置為(wéi)true後協程不(bú)會再啟動。
6.協(xié)同程序的執行順序
開始協(xié)同程序 -> 執行協同程序 -> 中斷協同(tóng)程序(中斷指令)-> 返(fǎn)回上層繼續執行
->中斷指令結束後繼續執行協同(tóng)程序剩下的內(nèi)容
7.協同程序的注意事項
1、不能再Update或者FixUpdate方法中使用(yòng)協同程序,否則(zé)會報錯(cuò)。
2、關於中斷指令:
中斷(duàn)指令(lìng)/YieldInstruction,一個協程收到中斷指令後暫停執行,返回上層(céng)執行(háng)同時等待這個指令達成後繼續執行。
指令 描述(shù) 實現
WaitForSeconds 等待指定秒數 yield return new WaitForSeconds(2);
WaitForFixedUpdate 等待一個固定(dìng)幀 yield return new WaitForFixedUpdate();
WaitForEndOfFrame 等(děng)待幀結束 yield return new WaitForEndOfFrame();
StartCoroutine 等待一個新協程暫停 yield return StartCoroutine(other coroutine);
WWW 等待一個加載(zǎi)完成(chéng) yield return www;
注意:
1、一個協程A裏在中斷指令裏(lǐ)再啟動(dòng)一個協程B,在yield return StartCoroutine時執行的順序是(shì):
①:先執行新(xīn)協程B;
②:新協程B暫(zàn)停後向上返回協程A,A協程暫停,返回協程A的上層(céng)函數;
③:因為決定協程A是否結束(shù)的標誌是新協程B是否結束,所(suǒ)以當新(xīn)協程B結束後返(fǎn)回協程A繼續執行(háng)餘下的內容;
④:協程A執行(háng)結束。
2、關於WWW的中斷(duàn)指令可參考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).
你可以檢查isDone屬性來查看是否已經下載完成(chéng),或者yield自動(dòng)等待下載物體,
直到它被下(xià)載完成(不會影響遊戲的其餘部分)。
3、協同程序的中(zhōng)斷返回機製也可用於指定時間間隔執行一個程序:
|
1
2
3
4
5
|
//每3秒執行一次
while(true){
//to do something
yield return new WaitForSeconds(3);
}
|
- 上一(yī)篇:串(chuàn)口(kǒu)數據包解析代碼分析 2019/1/10
- 下一篇:Unity3D協程Coroutine解析 2019/1/9
