如何屈服
你可以等到下一帧。
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 的发展而略有变化,因此如果相关,请谷歌获取最新信息。)