Unity 協程詳解

2021-10-20 03:36:20 字數 1060 閱讀 9152

class

myiter

:ienumerable

}

myiter iter =

newmyiter()

;foreach

(int num in iter)

我們需要讓資料結構支援foreach遍歷,所以要繼承ienumerable介面,實現getenumerator方法返回乙個迭代器,那麼這裡就很奇怪,返回值明明是ienumerator型別的,但是我們並沒有看到返回了該型別的物件。這裡就要介紹一下我們的yield return了。yield return是c#為我們提供的乙個語法糖,當我們使用這個語法糖的時候,系統會自動的幫我們生成乙個繼承ienumerator介面的類。我們可以這麼去理解,看到方法中一共有三行**。我們foreach中輸出的結果分別是3,2,1。那麼也就是說,我們yield return出去的值其實就相當於我們ienumerator物件的current屬性,而movenext就相當於從當前位置執行到yield return的位置。當我們進行foreach迴圈,那麼**會執行到yield return 3的位置,此時就退出去了。等到下一次呼叫movenext,又從yield return繼續執行至yield return 2,以此類推,方法中的邏輯走完之後,movenext則返回false,也就是遍歷結束了。所以我們可以看出來,我們每次去呼叫movenext,其實就是執行一部分**片段,將這個方法的邏輯切分成好幾部分來執行。

而這個就是協程的原理。foreach遍歷,是一次性將迭代器的內容都遍歷完再執行下面的**。而協程本質上就是乙個迭代器,但是這個迭代器的movenext方法是每幀呼叫一次,那麼就相當於是每一幀執行方法邏輯的一部分。

void

start()

public

ienumerator

getenumerator()

所以,當玩家開啟協程,會執行第一句然後就退出去了,下一幀在進來,以此類推。

所以說,協程還是在主線程上的,其實把迭代器搞懂了,協程自然就懂了,如果不懂得,還是建議多看看迭代器。

Unity 之 協程 初級

協程可以通過startcoroutine 來呼叫 只需要在裡面穿進去乙個ienumerator型別的方法 就可以了。這個方法是可以帶有引數的哦。舉個例子 ienumerator test2 void start 這樣就在一開始呼叫這個test2的方法了 現在我來著重講講最讓人煩心的yield ret...

Unity中的協程

1.建立協程 迭代器 ienumerator private ienumerator test 裡面可以使用 yield return new waitforsecond 1 等待1s後執行後面的 yield return new waitforseconds 0.3f 等待0.3秒,一段指定的時間...

unity系統與協程

一 指令碼執行順序 awake 遊戲開始指令碼掛載即執行,每次載入只執行一次 onenable 元件啟用就呼叫,前提遊戲物體必須啟用 ondisable start 指令碼啟用時執行,每次載入只執行一次 fixedupdate 每秒固定次數呼叫。次數 1 fixed timestep ondestr...