如何屈服

你可以等到下一幀。

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 的發展而略有變化,因此如果相關,請谷歌獲取最新資訊。)