Unity中協(xié)程IEnumerator的使用方法介紹詳解_第1頁
Unity中協(xié)程IEnumerator的使用方法介紹詳解_第2頁
Unity中協(xié)程IEnumerator的使用方法介紹詳解_第3頁
Unity中協(xié)程IEnumerator的使用方法介紹詳解_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Unity中協(xié)程IEnumerator的使用方法介紹詳解在Unity中,一般的方法都是順序執(zhí)行的,一般的方法也都是在一幀中執(zhí)行完畢的,當我們所寫的方法需要耗費一定時間時,便會出現(xiàn)幀率下降,畫面卡頓的現(xiàn)象。當我們調用一個方法想要讓一個物體緩慢消失時,除了在Update中執(zhí)行相關操作外,Unity還提供了更加便利的方法,這便是協(xié)程。

在通常情況下,如果我們想要讓一個物體逐漸消失,我們希望方法可以一次調用便可在程序后續(xù)執(zhí)行中實現(xiàn)我們想要的效果。

我們希望代碼可以寫成如下所示:

voidFade()

for(floatf=1f;ff-=0.1f)

Colorc=renderer.material.color;

c.a=f;

renderer.material.color=c;

然而該方法在調用時將在一幀中執(zhí)行完畢,無法實現(xiàn)預期的效果。如果將該方法改寫并放到Update函數中可實現(xiàn)我們預期的效果,但是還不夠優(yōu)雅。

floattime=0f;

floatfadeTime=2f;

voidFade()

time+=Time.dealttime;

Colorc=renderer.material.color;

c.a=1f-time/fadeTime;

renderer.material.color=c;

Unity中的協(xié)程方法通過yield這個特殊的屬性可以在任何位置、任意時刻暫停。也可以在指定的時間或事件后繼續(xù)執(zhí)行,而不影響上一次執(zhí)行的就結果,提供了極大地便利性和實用性。

協(xié)程在每次執(zhí)行時都會新建一個(偽)新線程來執(zhí)行,而不會影響主線程的執(zhí)行情況。

正如上邊的方法,我們使用協(xié)程可以更加方便的實現(xiàn)我們想要的效果。

voidFade()

for(floatf=1f;ff-=0.1f)

Colorc=renderer.material.color;

c.a=f;

renderer.material.color=c;

yieldreturnnull;//下一幀繼續(xù)執(zhí)行for循環(huán)

yieldreturnnewWaitForSeconds(0.1f);//0.1秒后繼續(xù)執(zhí)行for循環(huán)

我們通過StartCoroutine()函數來調用協(xié)程函數。

值得注意的是,協(xié)程并不會在Unity中開辟新的線程來執(zhí)行,其執(zhí)行仍然發(fā)生在主線程中。當我們有較為耗時的操作時,可以將該操作分散到幾幀或者幾秒內完成,而不用在一幀內等這個操作完成后再執(zhí)行其他操作。

如我們需要執(zhí)行一個循環(huán):

IEnumeratorCaculateResult()

for(inti=0;i10000;i++)

//內部循環(huán)計算

//在這里的yield會讓改內部循環(huán)計算每幀執(zhí)行一次,而不會等待10000次循環(huán)結束后再跳出

//yieldreturnnull;

//如果取消內部的yield操作,僅在for循環(huán)外邊寫yield操作,則會執(zhí)行完10000次循環(huán)后再結束,相當于直接調用了一個函數,而非協(xié)程。

//yieldreturnnull;

調用協(xié)程的方法有兩種,分別是StartCoroutine(/這里直接調用方法,添加參數/),另一種是StartCoroutine(/這里填寫字符串的方法名字,方法參數/)。第一種方法的優(yōu)勢在于可以調用多個參數的方法,后一種方法只能調用不含參數或只包含一個參數的協(xié)程方法。但是第一種方法不能通過StopCoroutine(/這里填寫字符串的方法名/)來結束協(xié)程,只能通過StopAllCoroutines來結束。后一種則可以通過StopCoroutine來結束對正在執(zhí)行的協(xié)程的調用。

協(xié)程在實現(xiàn)過程中我們需要注意yield調用的時機,執(zhí)行較為復雜的計算時,如果在時間上沒有嚴格的先后順序,我們可以每幀執(zhí)行一次循環(huán)來完成計算,或者每幀執(zhí)行指定次數的循環(huán)來防止在程序運行中出現(xiàn)的卡頓現(xiàn)象。

yieldreturn的介紹:

yieldreturnnull;//下一幀再執(zhí)行后續(xù)代碼

yieldreturn0;//下一幀再執(zhí)行后續(xù)代碼

yieldreturn6;//(任意數字)下一幀再執(zhí)行后續(xù)代碼

yieldbreak;//直接結束該協(xié)程的后續(xù)操作

yieldreturnasyncOperation;//等異步操作結束后再執(zhí)行后續(xù)代碼

yieldreturnStartCoroution(/*某個協(xié)程*/);//等待某個協(xié)程執(zhí)行完畢后再執(zhí)行后續(xù)代碼

yieldreturnWWW();//等待WWW操作完成后再執(zhí)行后續(xù)代碼

yieldreturnnewWaitForEndOfFrame();//等待幀結束,等待直到所有的攝像機和GUI被渲染完成后,在該幀顯示在屏幕之前執(zhí)行

yieldreturnnewWaitForSeconds(0.3f);//等待0.3秒,一段指定的時間延遲之后繼續(xù)執(zhí)行,在所有的Update函數完成調用的那一幀之后(這里的時間會受到Time.timeScale的影響);

yieldreturnnewWaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的時間延遲之后繼續(xù)執(zhí)行,在所有的Update函數完成調用的那一幀之后(這里的時間不受到Time.timeScale的影響);

yieldreturnWaitForFixedUpdate();//等待下一次FixedUpdate開始時再執(zhí)行后續(xù)代碼

yieldreturnnewWaitUntil()//將協(xié)同執(zhí)行直到當輸入的參數(或者委托)為true的時候....如:yieldreturnnewWaitUntil(()=frame=10);

yieldreturnnewWaitWhile()//將協(xié)同執(zhí)行直到當輸入的參數(或者委托)為false的時候....如:yieldreturnnewWaitWhile(()=frame10);

當某一個腳本中的協(xié)程在執(zhí)行過程中,如果我們將該腳本的enable設置為false,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論