unity協程與迭代原理

    對於協程的理解,我認爲最好的說法是:

    一段順序的代碼,然後標明哪裏需要暫停,然後在下一幀或者一段時間後或者某個函數或協程執行完成之後,系統會繼續執行後面代碼。協程不是線程,也不是異步執行的。

這就說明它的兩個作用,定時,迭代(與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每幀對會去處理的函數。





發佈了45 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章