Unity-協(xié)程
調(diào)用函數(shù)時,函數(shù)將運行到完成狀態(tài),然后返回。這實際上意味著在函數(shù)中發(fā)生的任何動作都必須在單幀更新內(nèi)發(fā)生;函數(shù)調(diào)用不能用于包含程序性動畫或隨時間推移的一系列事件。例如,假設(shè)需要逐漸減少對象的 Alpha(不透明度)值,直至對象變得完全不可見。
就目前而言,F(xiàn)ade 函數(shù)不會產(chǎn)生期望的效果。為了使淡入淡出過程可見,必須通過一系列幀降低 Alpha 以顯示正在渲染的中間值。但是,該函數(shù)將完全在單個幀更新中執(zhí)行。這種情況下,永遠不會看到中間值,對象會立即消失。
可以通過向 Update 函數(shù)添加代碼(此代碼逐幀執(zhí)行淡入淡出)來處理此類情況。但是,使用協(xié)程來執(zhí)行此類任務(wù)通常會更方便。
協(xié)程就像一個函數(shù),能夠暫停執(zhí)行并將控制權(quán)返還給 Unity,然后在下一幀繼續(xù)執(zhí)行。在 C# 中,聲明協(xié)程的方式如下:
此協(xié)程本質(zhì)上是一個用返回類型 IEnumerator 聲明的函數(shù),并在主體中的某個位置包含 yield return 語句。yield return 行是暫停執(zhí)行并隨后在下一幀恢復(fù)的點。要將協(xié)程設(shè)置為運行狀態(tài),必須使用?StartCoroutine?函數(shù):
您會注意到 Fade 函數(shù)中的循環(huán)計數(shù)器能夠在協(xié)程的生命周期內(nèi)保持正確值。實際上,在 yield 語句之間可以正確保留任何變量或參數(shù)。
默認情況下,協(xié)程將在執(zhí)行 yield 后的幀上恢復(fù),但也可以使用?WaitForSeconds?來引入時間延遲:
可通過這樣的協(xié)程在一段時間內(nèi)傳播效果,但也可將其作為一種有用的優(yōu)化。游戲中的許多任務(wù)需要定期執(zhí)行,最容易想到的方法是將任務(wù)包含在 Update 函數(shù)中。但是,通常情況下,每秒將多次調(diào)用該函數(shù)。不需要以這樣的頻繁程度重復(fù)任務(wù)時,可以將其放在協(xié)程中來進行定期更新,而不是每一幀都更新。這方面的一個示例可能是在附近有敵人時向玩家發(fā)出的警報。此代碼可能如下所示:
如果有很多敵人,那么每幀都調(diào)用此函數(shù)可能會帶來很大開銷。但是,可以使用協(xié)程,每十分之一秒調(diào)用一次:
這將大大減少所進行的檢查次數(shù),而不會對游戲運行過程產(chǎn)生任何明顯影響。
注意:禁用 MonoBehaviour 時,不會停止協(xié)程,僅在明確銷毀 MonoBehaviour 時才會停止協(xié)程??梢允褂?MonoBehaviour.StopCoroutine 和 MonoBehaviour.StopAllCoroutines 來停止協(xié)程。銷毀 MonoBehaviour 時,也會停止協(xié)程。