如何屈服
你可以等到下一幀。
yield return null; // wait until sometime in the next frame
你可以連續多次呼叫這些呼叫,只需等待所需的幀數即可。
//wait for a few frames
yield return null;
yield return null;
等待大約 n 秒鐘。理解這只是一個非常近似的時間是非常重要的。
yield return new WaitForSeconds(n);
對於任何形式的精確計時,絕對不可能使用 WaitForSeconds
呼叫。
通常你想要連鎖行動。所以,做一些事情,當它完成時做其他事情,當完成時做其他事情。為此,請等待另一個協程:
yield return StartCoroutine(coroutine);
明白你只能從協程中呼叫它。所以:
StartCoroutine(Test());
這就是你從一個正常程式碼開始一個協程的方法。
然後,在執行協同程式裡面:
Debug.Log("A");
StartCoroutine(LongProcess());
Debug.Log("B");
這將列印,開始漫長的過程,並立即印片 B 。它不會等待漫長的過程完成。另一方面:
Debug.Log("A");
yield return StartCoroutine(LongProcess());
Debug.Log("B");
這將列印 A,啟動長程序,等待它完成,然後列印 B.
總是值得記住的是,協程與執行緒完全沒有任何聯絡。使用此程式碼:
Debug.Log("A");
StartCoroutine(LongProcess());
Debug.Log("B");
很容易將其視為喜歡在後臺的另一個執行緒上啟動 LongProcess。但這絕對是錯誤的。它只是一個協程。遊戲引擎是基於框架的,Unity 中的協同程式只允許你訪問框架。
等待 Web 請求完成非常容易。
void Start() {
string url = "http://google.com";
WWW www = new WWW(url);
StartCoroutine(WaitForRequest(www));
}
IEnumerator WaitForRequest(WWW www) {
yield return www;
if (www.error == null) {
//use www.data);
}
else {
//use www.error);
}
}
為了完整性:在極少數情況下,你在 Unity 中使用固定更新; 有一個通常永遠不會被使用的 WaitForFixedUpdate()
呼叫。有一個特定的呼叫(當前版本的 Unity 中的 WaitForEndOfFrame()
),它在某些情況下用於在開發期間生成螢幕捕獲。 (確切的機制隨著 Unity 的發展而略有變化,因此如果相關,請谷歌獲取最新資訊。)