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