一、Coroutine(協同程序)
Coroutine,就是在主程序運行的同時開啓另一個線程,來協同當前程序的執行。在一般規模較大的遊戲中常常需要使用協程,這樣的好處是——協程在協調在幾幀中執行的操作時有極大的用處,因爲協程幾乎無性能開銷。
一般來說,我們有兩種方法來開啓一個線程,StartCoroutine(string Name)和StartCoroutine(IEnumerator Routine)。
前者可以開啓線程並在線程結束前終止線程,而後者只能等待線程的結束而不能隨時終止;另外使用StartCoroutine(string Name)時,開啓線程時最多隻能傳遞一個參數,與此同時性能消耗也會增大;而使用StartCoroutine(IEnumerator Routine)則沒有這個限制。
而關閉協程也有兩種方法,StopCoroutine(string Name)和StopAllCoroutines()。但是後者是用來終止所有Coroutine,這裏使用時需要注意。
二、Yield return(Coroutine中返回調用迭代語句)
在協程中,必須需要Yield return來返回值,而yield return的值決定了什麼時候使該協程恢復執行。yield return 後面可以接幾種值:
- yield return + “int類型的值”。指當前暫停一幀,從下一幀繼續開始執行。
- yield return + “協程”。yield return 後面可以跟一個協程,當執行到該行代碼的時候執行其後面的協程,如果下面還有代碼在執行完yield return 後面的協程時候,回來繼續執行。例如:yield return StartCoroutine(xxx());
- yield return new WaitForSeconds(時間)。這主要是等待幾秒鐘後執行再yield return 後面的代碼。
- yield return + “自定義的類”。
三、關於多個Coroutine的執行順序
話不多說,我們先上代碼看看:
void Start () {
Debug.Log("x1");
StartCoroutine(Test());
Debug.Log("x2");
}
IEnumerator Test()
{
Debug.Log("y1");
yield return new WaitForSeconds(5);//等待5s後再進行調用返回
Debug.Log("y2");
}
這裏的執行結果:x1 -> y1 -> x2 -> y2 ,y2是等待5s後才執行出來的結果。
如果這裏能理解的話,我們再看看稍微難一點的:
void Start () {
Debug.Log("a1");
StartCoroutine(First());
Debug.Log("a2");
}
IEnumerator First()
{
Debug.Log("b1");
yield return StartCoroutine(Second());
Debug.Log("b2");
}
IEnumerator Second()
{
Debug.Log("c1");
yield return null;
Debug.Log("c2");
}
這裏的執行結果:a1 -> b1 -> c1 -> a2 -> c2 -> b2
原因:這種StartCoroutine中嵌套一個yield return StartCoroutine,此時有兩個Coroutine存在;那麼First()會等到Second()中所有代碼執行完畢後再繼續執行,而Second()中的yield語句會先返回到First(),然後立即返回到First()的調用處,也就是Start ()會繼續執行,Start ()執行完畢後會跳回到Second()進行執行,這是最先發出“返回調用”的地方,而First()會等待Second()執行完再繼續執行。
好了,Unity中的Coroutine和yield return基本功能大概就這些,如果想更深入理解的話建議大家到Unity官網中查看對應的官方解釋。