unity3d 协程
示例
首先,必须了解,游戏引擎(例如Unity)在“基于框架”的范例上工作。
在每一帧中执行代码。
其中包括Unity自己的代码以及您的代码。
在考虑框架时,一定要了解,绝对不能保证框架何时发生。他们不会定期跳动。帧之间的间隙可以是例如0.02632,然后是0.021167,然后是0.029778,依此类推。在该示例中,它们全都是“大约”1/50秒,但它们都是不同的。而且在任何时候,您可能需要花费更长或更短的时间才能获得帧。并且您的代码可以在框架内的任何时间执行。
牢记这一点,您可能会问:如何在Unity中的代码中访问这些框架?
很简单,您可以使用Update()呼叫,也可以使用协程。(实际上,它们是完全相同的东西:它们允许代码在每个帧中运行。)
协程的目的是:
您可以运行一些代码,然后“停止并等待”直到以后的某个帧。
您可以等待到下一帧,可以等待许多帧,或者可以等待未来几秒钟的大约时间。
例如,您可以等待“大约一秒钟”,这意味着它将等待大约一秒钟,然后从现在开始大约一秒钟将您的代码放在某个帧中。(实际上,在该框架内,代码可以在任何时间运行。)要重复:它不会精确到一秒钟。准确的计时在游戏引擎中毫无意义。
在协程内部:
要等待一帧:
//做点什么 yield return null; //等到下一帧 //做点什么
等待三帧:
//做点什么 yield return null; //等到从现在开始三帧 yield return null; yield return null; //做点什么
等待大约半秒钟:
//做点什么 yield return new WaitForSeconds (0.5f); //等待约0.5秒钟的画面 //做点什么
每帧都要做一些事情:
while (true) { //做点什么 yield return null; //等到下一帧 }
该示例实际上与将某些内容简单地放入Unity的“Update”调用中完全相同:“执行某项操作”中的代码每帧运行一次。
示例
将股票代码附加到GameObject。当该游戏对象处于活动状态时,刻度线将运行。请注意,当游戏对象变为非活动状态时,脚本会仔细停止协程。这通常是正确设计协程用法的重要方面。
using UnityEngine; using System.Collections; public class Ticker:MonoBehaviour { void OnEnable() { StartCoroutine(TickEverySecond()); } void OnDisable() { StopAllCoroutines(); } IEnumerator TickEverySecond() { var wait = new WaitForSeconds(1f); //谨记:它仅是近似的 while(true) { Debug.Log("Tick"); yield return wait; //等待一帧,大约从现在开始1秒钟 } } }