Unity 协程深入解析与原理
先來直接放一段代碼
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class CoroutineTest : MonoBehaviour 6 { 7 8 void Start() 9 { 10 Debug.Log("Start Begin"); 11 12 CustomCoroutine = DelayPrint("Hi"); 13 14 Debug.Log("Start End"); 15 } 16 17 bool isStartCoroutine = true; 18 IEnumerator CustomCoroutine = null; 19 void Update() 20 { 21 Debug.Log("第"+Time.frameCount+"Update 在執(zhí)行"); 22 if (isStartCoroutine) 23 { 24 if (CustomCoroutine.MoveNext()) 25 { 26 Debug.Log(CustomCoroutine.Current.ToString()); 27 } 28 } 29 Debug.Log("第" + Time.frameCount + "Update執(zhí)行結(jié)束"); 30 } 31 32 public IEnumerator DelayPrint(string somevalue) 33 { 34 Debug.Log("DelayPrint Start"); 35 yield return 0; 36 Debug.Log("DelayPrint Debug:" + somevalue); 37 Debug.Log("DelayPrint End"); 38 } 39 40 } CoroutineTest代碼結(jié)果如下:
這樣一看是不是跟我們平時在Unity使用的StartCoroutine基本上是一樣的了?其實(shí)還是有不一樣的地方,這因?yàn)樵赨nity內(nèi)部對自己的協(xié)程管理作了特殊處理(猜測)。
在Unity內(nèi)的協(xié)程位置順序圖如下:
而我們在上面寫的自己的協(xié)程只會在Update里運(yùn)行,因?yàn)槲覀冊赨pdate里寫MoveNext(),若是想在其他地方運(yùn)行我們的協(xié)程就寫在其他地方就好~
所以說Unity協(xié)程的本質(zhì)就是Unity內(nèi)部的輪詢機(jī)制和IEnumerator迭代保存上下文執(zhí)行代碼段。
而我們平時在協(xié)程方法yield return XXX只是把這時刻代碼運(yùn)行的控制權(quán)交回給主線程(類似操作系統(tǒng)中的掛起),其他協(xié)程或者其他線程(類似WWW類,這會真正開啟另一個線程去執(zhí)行,否則本質(zhì)上都是單線程),,然后保存當(dāng)前方法代碼段的狀態(tài),等Unity內(nèi)部的再次輪詢回到被掛起時的代碼狀態(tài)繼續(xù)執(zhí)行,直到?jīng)]有yield return的時候,這樣就形成了一種代碼分段執(zhí)行的效果。
也當(dāng)只有yield return XXX時IEnumerator.MoveNext()才會為true,然后IEnumerator.Current是yield return XXX的XXX。
所以在Unity里面的yield return?WaitForSeconds返回給Unity中內(nèi)部的協(xié)程狀態(tài)機(jī)作判斷處理,例如如果是返回WaitForSeconds類則給這個協(xié)程求時間差以達(dá)到延遲處理。
如果沒有yield return,也就是沒有返回值,這時IEnumerator.MoveNext()為false,這就會退出了Unity輪詢。
大概就這樣,要是更想理解細(xì)節(jié)的話可以百度IEnumerator和作用和把上面的代碼逐步調(diào)試下即可。
參考:https://www.zhihu.com/question/34878524/answer/61555725
https://www.zhihu.com/question/23895384/answer/26066323
??http://dsqiu.iteye.com/blog/2029701
??CoroutineManager插件源碼(這個插件是在自己的Update方法里不斷輪詢CoroutineManager的協(xié)程集合內(nèi),獲取每個協(xié)程的MoveNext()狀態(tài),從而進(jìn)行一些簡單的判斷管理一個協(xié)程)
轉(zhuǎn)載于:https://www.cnblogs.com/SeaSwallow/p/6561053.html
總結(jié)
以上是生活随笔為你收集整理的Unity 协程深入解析与原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。