如何屈服

你可以等到下一帧。

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 的发展而略有变化,因此如果相关,请谷歌获取最新信息。)