Unity的協程系統是基於C#的一個簡單而強大的接口 ,IEnumerator,它允許你為自己的集合類型編寫枚舉器。這樣說有點難懂,其實unity中的協程其實就是為一個方法開闢多個入口。
我們來看看協程最基本的使用:
通過"yield return"把方法停住,直到下一次你想調用這個方法的時間再從剛剛停止的地方繼續進行,就像做了一個計時器,實現了每五秒一次輸出。
關於下一次入口的位置還可以這樣:
yield return null; // 下一幀再執行後續代碼
yield return 0; //下一幀再執行後續代碼
yield return 6;//(任意數字) 下一幀再執行後續代碼
yield break; //直接結束該協程的後續操作
yield return asyncOperation;//等異步操作結束後再執行後續代碼
yield return StartCoroution(/*某個協程*/);//等待某個協程執行完畢後再執行後續代碼
yield return WWW();//等待WWW操作完成後再執行後續代碼
yield return new WaitForEndOfFrame();//等待幀結束,等待直到所有的攝像機和GUI被渲染完成後,在該幀顯示在屏幕之前執行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的時間延遲之後繼續執行,在所有的Update函數完成調用的那一幀之後(這裡的時間會受到Time.timeScale的影響);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的時間延遲之後繼續執行,在所有的Update函數完成調用的那一幀之後(這裡的時間不受到Time.timeScale的影響);
...
關於結束協程
一般用這兩個方法
StopCoroutine(string)
StopCoroutine(「協程方法名」)
只能停止以StartCoroutine(「協程方法名」)開啟的協程;
StopAllCoroutine()
停止本對象中開啟的所有協程;
一些關於協程的注意事項
在程序中調用StopCoroutine()方法只能終止以字符串形式啟動(開始)的協程;
多個協程可以同時運行,它們會根據各自的啟動順序來更新協程可以嵌套任意多層
如果你想讓多個腳本訪問一個協程,那麼你可以定義靜態的協程;
協程不是多線程,它們運行在同一線程中,跟普通的腳本一樣;如果你的程序需要進行大量的計算,那麼可以考慮在一個隨時間進行的協程中處理它們;
IEnumerator類型的方法不能帶ref或者out型的參數