StartCoroutine在unity3d的幫助中叫做協程,意思就是啟動一個輔助的線程。
在C#中直接有Thread這個線程,但是在unity中有些元素是不能操作的。這個時候可以使用協程來完成。
使用線程的好處就是不會出現界面卡死的情況,如果有一次非常大量的運算,沒用線程就會出現假死的情況。
下面通過一個簡單的例子來說明使用協程的好處:
- void OnGUI()
- {
- GUI.Label(new Rect(0, 0, 200, 50), "測試1:" + result);
- if (GUI.Button(new Rect(0, 100, 100, 50), "開啟協程"))
- {
- StartCoroutine(GetResult());
- }
- GUI.Label(new Rect(200, 0, 200, 50), "測試2:" + result1);
- if (GUI.Button(new Rect(200, 100, 100, 50), "無協程測試"))
- {
- GetResult1();
- }
- }
上面的代碼表示在GUI中定義2個label和按鈕,一個按鈕啟動協程計算,另一個直接計算結果。由於2個方法都是計算同樣的結果,計算量比較大,所以直接計算出現了暫時的卡死情況。
- float result;
- IEnumerator GetResult()
- {
- for (int i = 0; i < 1000; i++)
- {
- for (int j = 0; j < 100000; j++)
- {
- result += (i + j);
- }
- if(i%100==0)
- yield return 1;
- }
- }
這個方法是協程的寫法,在C#中協程要定義為IEnumerator 這個類型,javascript中不需要。
yield return 1;這句話表示返回1幀的結果。在i為100的整數時,就返回一次結果,這樣可以避免大量的計算卡死。
- float result1;
- void GetResult1()
- {
- for (int i = 0; i < 1000; i++)
- {
- for (int j = 0; j < 100000; j++)
- {
- result1 += (i + j);
- }
- }
- }
這個方法就是直接計算結果,由於運算量比較大,所以界面會卡死,這樣就可以體現出用協程的好處了。
使用IEnumerator 這個類型時,必須用yield return來返回結果,參數為數字時表示為幀數。
如yield return 1 表示每一幀返回一次結果。