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