Unity中coroutine問題的示例分析

這篇文章主要介紹了Unity中coroutine問題的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)隆堯,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220

1、從表面看協(xié)程的執(zhí)行順序

一個(gè)最簡(jiǎn)單的協(xié)程函數(shù):

IEnumerator Test()
{
    yield return new WaitForSeconds(1);
    Debug.Log("End");
}

// 在其它地方StartCoroutine(Test());

作用:當(dāng)你在其它地方執(zhí)行了StartCoroutine(Test());之后,1秒之后打印“End”。

在開啟協(xié)程之后,Test何時(shí)被調(diào)用?答案其實(shí)是每幀都要調(diào)用一次。(對(duì)迭代器函數(shù)來(lái)說(shuō),意思是每幀繼續(xù)執(zhí)行一次)。

如果每幀都繼續(xù),那么Test為什么最終在一秒后繼續(xù)執(zhí)行呢?答案在WaitForSeconds里面。

流程是這樣的:

1、在StartCoroutine(Test())里,Test第一次被執(zhí)行,yield中止并返回一個(gè)“WaitForSeconds(1)”對(duì)象。

2、執(zhí)行StartCoroutine時(shí),Unity內(nèi)部注冊(cè)這個(gè)Test函數(shù)。因?yàn)橹竺繋家{(diào)用,Unity內(nèi)部先記下來(lái)。

3、這里,返回的WaitForSeconds(1)其實(shí)是一個(gè)小花招,它的設(shè)計(jì)思路是:

如果(Time.time小于之前說(shuō)好的時(shí)間)
{
    返回:沒結(jié)束;
}
返回:結(jié)束了,繼續(xù)。

// 這里用偽碼表示,想知道原理可以看后面的Unity官方說(shuō)明文檔

4、記?。簠f(xié)程函數(shù)每幀都要調(diào)用一次。于是Unity引擎層在這一秒,每幀都調(diào)用Test函數(shù),重復(fù)了幾十次,每次都被WaitForSeconds擋住,無(wú)法往下執(zhí)行。

5、直到某一次調(diào)用,時(shí)隔1秒后了,WaitForSeconds終于放行了,Test才有機(jī)會(huì)繼續(xù)執(zhí)行,打印“End”。

這就是以WaitForSeconds為例解釋的,協(xié)程的執(zhí)行流程,以及等待1秒的原理。

2、解釋yield return www;

現(xiàn)在可以回到題主問題了,其實(shí)yield return www 和 yield return new WaitForSeconds(1)是完全一樣的道理,WWW的設(shè)計(jì)是:

如果(網(wǎng)絡(luò)請(qǐng)求還在進(jìn)行中)
{
    返回:沒結(jié)束;
}
返回:結(jié)束了

同樣的方式,如果網(wǎng)絡(luò)請(qǐng)求沒完成,那么你的協(xié)程函數(shù)就會(huì)被www阻攔住。這樣就巧妙實(shí)現(xiàn)了一種異步機(jī)制,整個(gè)游戲不會(huì)因?yàn)閣ww而卡住。

3、Unity如何做到這一點(diǎn)的?

eldereal 的回答很詳細(xì),其實(shí)C#根本就不支持真正的協(xié)程,而只支持迭代器。

由于游戲引擎的特殊性(每幀更新),Unity很巧妙的把迭代器改裝成了一個(gè)似乎能并行執(zhí)行的東西,也確實(shí)很好用。

別忘了,WWW和WaitForSeconds都是Unity提供的類,并不是C#原本就支持的。如果你很好奇,想擴(kuò)展出自己的類似WWW的類,參考官方文檔自定義Yield對(duì)象:

CustomYieldInstruction

https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html

由于Unity的這種“偽”協(xié)程屬于自己制定的方案,未來(lái)引擎更新時(shí)候甚至?xí)薷脑O(shè)計(jì),所以理解調(diào)用順序和大致原理更重要,不要拘泥于代碼本身。

4、其它說(shuō)明

Unity的Coroutine機(jī)制設(shè)計(jì)的很好,就是這個(gè)名字起的太有問題了,無(wú)論英文的Coroutine和中文的協(xié)程,都很不合適。

有一定golang、python gevent、skynet開發(fā)經(jīng)驗(yàn)的人(主要是服務(wù)器端的),都對(duì)協(xié)程有較好的理解,而Unity的協(xié)程與真正的協(xié)程差異太大了。起同樣的名字帶來(lái)很大的誤導(dǎo)作用,交流也很困難。

一句話解釋Unity協(xié)程:其實(shí)Unity的Coroutine在我看來(lái),更像是“注冊(cè)一個(gè) 每幀都調(diào)用的函數(shù)”,只不過(guò)這個(gè)函數(shù)支持yield中止,僅此而已。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Unity中coroutine問題的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

網(wǎng)站名稱:Unity中coroutine問題的示例分析
文章起源:http://muchs.cn/article46/jcpheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、移動(dòng)網(wǎng)站建設(shè)定制網(wǎng)站、軟件開發(fā)ChatGPT、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管