1. 程式人生 > 實用技巧 >unity 自實現協程總結

unity 自實現協程總結

unity本人自實現了一個協程呼叫。

只是moveNext()的簡單協程呼叫和封裝,這個沒什麼好說的, 網上例子一大堆。

但使用的過程中遇到了幾個問題。

1. 自己寫的moveNext() 協程不能等待YieldInstruction 和CustomYieldInstruction 擴充套件類。

  具體原因 猜測是 yield 底層封裝好了,固定了實現,並沒有把其他的介面暴露出來。

2. 無法等待繼承IEnumerator 在moveNext() 函式裡面返回true的協程寫法。

  原理  每次IEnumerator.MoveNext() 會自動跳轉到上次執行的程式碼後面。應該是底層記錄了上次的執行資訊。

     StartCoroutine在MoveNext()返回true的時候,應該會繼續卡在當前位置。(但是並沒有清除當前記錄資訊的介面暴露給我們,所以我們無法清除當前呼叫資訊)。

上述的兩個問題, 導致自實現的, 只能寫簡單的


IEnumerator func(){
  ...重複程式碼
yield return null;
}

這樣簡單的協程。兩方都有不方便的地方。

他自帶的協程,基於Monobehaviour,必須保證物件的active 等屬性,而且無法定製。複雜的功能,寫起來很痛苦。

自己寫的話, 程式碼長,大部分都需要自己造輪子。但是可控, 而且可以加入一些自定義的順序關係(優先順序,id ...)等一系列資訊控制。

但反而感覺自己寫了個大的TaskManager.Update()的感覺。