日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 协程深入解析与原理

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity 协程深入解析与原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先來直接放一段代碼

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。