Unity中協(xié)程IEnumerator的使用方法介紹詳解
在Unity中,一般的方法都是順序執(zhí)行的,一般的方法也都是在一幀中執(zhí)行完畢的,當(dāng)我們所寫的方法需要耗費一定時間時,便會出現(xiàn)幀率下降,畫面卡頓的現(xiàn)象。當(dāng)我們調(diào)用一個方法想要讓一個物體緩慢消失時,除了在Update中執(zhí)行相關(guān)操作外,Unity還提供了更加便利的方法,這便是協(xié)程。
在通常情況下,如果我們想要讓一個物體逐漸消失,我們希望方法可以一次調(diào)用便可在程序后續(xù)執(zhí)行中實現(xiàn)我們想要的效果。
我們希望代碼可以寫成如下所示:
void Fade() { for (float f = 1f; f >= 0; f -= 0.1f) { Color c = renderer.material.color; c.a = f; renderer.material.color = c; } }
然而該方法在調(diào)用時將在一幀中執(zhí)行完畢,無法實現(xiàn)預(yù)期的效果。如果將該方法改寫并放到Update函數(shù)中可實現(xiàn)我們預(yù)期的效果,但是還不夠優(yōu)雅。
float time = 0f; float fadeTime = 2f; void Fade() { time += Time.dealttime; Color c = renderer.material.color; c.a = 1f - time/fadeTime; renderer.material.color = c; }
Unity中的協(xié)程方法通過yield這個特殊的屬性可以在任何位置、任意時刻暫停。也可以在指定的時間或事件后繼續(xù)執(zhí)行,而不影響上一次執(zhí)行的就結(jié)果,提供了極大地便利性和實用性。
協(xié)程在每次執(zhí)行時都會新建一個(偽)新線程來執(zhí)行,而不會影響主線程的執(zhí)行情況。
正如上邊的方法,我們使用協(xié)程可以更加方便的實現(xiàn)我們想要的效果。
void Fade() { for (float f = 1f; f >= 0; f -= 0.1f) { Color c = renderer.material.color; c.a = f; renderer.material.color = c; yield return null;//下一幀繼續(xù)執(zhí)行for循環(huán) yield return new WaitForSeconds(0.1f);//0.1秒后繼續(xù)執(zhí)行for循環(huán) } }
我們通過StartCoroutine()函數(shù)來調(diào)用協(xié)程函數(shù)。
值得注意的是,協(xié)程并不會在Unity中開辟新的線程來執(zhí)行,其執(zhí)行仍然發(fā)生在主線程中。當(dāng)我們有較為耗時的操作時,可以將該操作分散到幾幀或者幾秒內(nèi)完成,而不用在一幀內(nèi)等這個操作完成后再執(zhí)行其他操作。
如我們需要執(zhí)行一個循環(huán):
IEnumerator CaculateResult() { for (int i = 0; i < 10000; i++) { //內(nèi)部循環(huán)計算 //在這里的yield會讓改內(nèi)部循環(huán)計算每幀執(zhí)行一次,而不會等待10000次循環(huán)結(jié)束后再跳出 //yield return null; } //如果取消內(nèi)部的yield操作,僅在for循環(huán)外邊寫yield操作,則會執(zhí)行完10000次循環(huán)后再結(jié)束,相當(dāng)于直接調(diào)用了一個函數(shù),而非協(xié)程。 //yield return null; }
調(diào)用協(xié)程的方法有兩種,分別是StartCoroutine(/這里直接調(diào)用方法,添加參數(shù)/),另一種是StartCoroutine(/這里填寫”字符串的方法名字”,方法參數(shù)/)。第一種方法的優(yōu)勢在于可以調(diào)用多個參數(shù)的方法,后一種方法只能調(diào)用不含參數(shù)或只包含一個參數(shù)的協(xié)程方法。但是第一種方法不能通過StopCoroutine(/這里填寫”字符串的方法名”/)來結(jié)束協(xié)程,只能通過StopAllCoroutines來結(jié)束。后一種則可以通過StopCoroutine來結(jié)束對正在執(zhí)行的協(xié)程的調(diào)用。
協(xié)程在實現(xiàn)過程中我們需要注意yield調(diào)用的時機,執(zhí)行較為復(fù)雜的計算時,如果在時間上沒有嚴格的先后順序,我們可以每幀執(zhí)行一次循環(huán)來完成計算,或者每幀執(zhí)行指定次數(shù)的循環(huán)來防止在程序運行中出現(xiàn)的卡頓現(xiàn)象。
yield return的介紹:
yield return null; // 下一幀再執(zhí)行后續(xù)代碼 yield return 0; //下一幀再執(zhí)行后續(xù)代碼 yield return 6;//(任意數(shù)字) 下一幀再執(zhí)行后續(xù)代碼 yield break; //直接結(jié)束該協(xié)程的后續(xù)操作 yield return asyncOperation;//等異步操作結(jié)束后再執(zhí)行后續(xù)代碼 yield return StartCoroution(/*某個協(xié)程*/);//等待某個協(xié)程執(zhí)行完畢后再執(zhí)行后續(xù)代碼 yield return WWW();//等待WWW操作完成后再執(zhí)行后續(xù)代碼 yield return new WaitForEndOfFrame();//等待幀結(jié)束,等待直到所有的攝像機和GUI被渲染完成后,在該幀顯示在屏幕之前執(zhí)行 yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的時間延遲之后繼續(xù)執(zhí)行,在所有的Update函數(shù)完成調(diào)用的那一幀之后(這里的時間會受到Time.timeScale的影響); yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的時間延遲之后繼續(xù)執(zhí)行,在所有的Update函數(shù)完成調(diào)用的那一幀之后(這里的時間不受到Time.timeScale的影響); yield return WaitForFixedUpdate();//等待下一次FixedUpdate開始時再執(zhí)行后續(xù)代碼 yield return new WaitUntil()//將協(xié)同執(zhí)行直到 當(dāng)輸入的參數(shù)(或者委托)為true的時候....如:yield return new WaitUntil(() => frame >= 10); yield return new WaitWhile()//將協(xié)同執(zhí)行直到 當(dāng)輸入的參數(shù)(或者委托)為false的時候.... 如:yield return new WaitWhile(() => frame < 10);
當(dāng)某一個腳本中的協(xié)程在執(zhí)行過程中,如果我們將該腳本的enable設(shè)置為false,協(xié)程不會停止。只有將掛載該腳本的物體設(shè)置為SetActive(false)時才會停止。
Unity在調(diào)用StartCoroutine()后不會等待協(xié)程中的內(nèi)容返回,會立即執(zhí)行后續(xù)代碼。
雖然協(xié)程十分方便和靈活,但不當(dāng)?shù)氖褂脮钩绦虍a(chǎn)生無法預(yù)想的后果,請使用前慎重考慮。
到此這篇關(guān)于Unity中協(xié)程IEnumerator的使用方法介紹詳解的文章就介紹到這了,更多相關(guān)Unity 協(xié)程IEnumerator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity UGUI的LayoutElement布局元素組件介紹使用示例
這篇文章主要為大家介紹了Unity UGUI的LayoutElement布局元素組件介紹使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07c#獲取字符串寬度的示例代碼(字節(jié)數(shù)方法)
本篇文章主要介紹了c#獲取字符串寬度的示例代碼(字節(jié)數(shù)方法)。需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01Asp.Net(C#)使用oleDbConnection 連接Excel的方法
ADO.NET采用不同的Connection對象連接數(shù)據(jù)庫。這篇文章主要介紹了Asp.Net(C#)使用oleDbConnection 連接Excel的方法,非常具有實用價值,需要的朋友可以參考下2018-11-11Visual Studio連接unity編輯器的實現(xiàn)步驟
unity編輯器中打開C#腳本的時候發(fā)現(xiàn)Visual Studio沒有連接unity編輯器,本文主要介紹了Visual Studio連接unity編輯器的實現(xiàn)步驟,感興趣的可以了解一下2023-11-11