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