對於協程的理解,我認爲最好的說法是:
一段順序的代碼,然後標明哪裏需要暫停,然後在下一幀或者一段時間後或者某個函數或協程執行完成之後,系統會繼續執行後面代碼。協程不是線程,也不是異步執行的。
這就說明它的兩個作用,定時,迭代(與for,foreach一起用)
舉個例子,
void Start()
{
StartCoroutine(Move());
}
StartCoroutine()就是開啓一個協程,在Start()裏調用,說明只在初始化的時候執行一次。
IEnumerator Move() {
yield return null;
yield return null;
yield return StartCoroutine(Just1());
yield return StartCoroutine(Just2());
StartCoroutine(Jisuan());
yield return null;
}
yield作爲其中最重要的,一個協程返回最少一個yield,可以有多個,上面return null,或者return 0, 1,2等等,表示暫緩一幀,數字沒有意義,都只是暫緩一幀;yield return new WaitForSeconds (2)表示暫緩2秒;break表示退出協程,還有很多就不列舉了。
while(true){
Debug.log(“hello”);
yield return null;
}
上面是個無限循環,加上yield return null 的作用顯而易見,每幀執行一次,防止卡死,如果是下面的話for(i=0;i<10;i++){
Debug.Log("hello")
yieid return null;
}
這就是有限次循環,多用於遊戲加載資源,倒計時等場景下。
協程其實就是一個IEnumerator(迭代器),IEnumerator 接口有兩個方法 Current 和 MoveNext() ,只有當MoveNext()返回 true時纔可以訪問 Current,否則會報錯。
Unity在每幀做的工作就是:調用 協程(迭代器)MoveNext() 方法,如果返回 true ,就從當前位置繼續往下執行。協程跟Update()其實一樣的,都是Unity每幀對會去處理的函數。