真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Unity中coroutine問題的示例分析

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

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

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

一個最簡單的協(xié)程函數(shù):

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

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

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

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

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

流程是這樣的:

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

2、執(zhí)行StartCoroutine時,Unity內(nèi)部注冊這個Test函數(shù)。因為之后每幀都要調(diào)用,Unity內(nèi)部先記下來。

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

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

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

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

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

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

2、解釋yield return www;

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

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

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

3、Unity如何做到這一點的?

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

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

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

CustomYieldInstruction

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

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

4、其它說明

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

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

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

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


標(biāo)題名稱:Unity中coroutine問題的示例分析
標(biāo)題URL:http://weahome.cn/article/jcpheg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部