脚本的生命周期
接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其它的任何方法,都将不再被执行。 如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable,当然我们可以在另外一个脚本中实现这个脚本组件的启动:this.enab=true; 再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。这是个什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将不再被执行。比如说:第一次启用时,将怪物的初始位置定在了(0,0,0)点,然后怪物可能会发生了位置的变换,后来被禁用了,再次启用时,不会让怪物又回到初始的(0,0,0)位置。
继续向后执行,就是Update了,然后是FixUpdate,再然后是LateUpdate,如果后面写了Reset,则会又回到Update,在这4个事件间可以进行循环流动。
再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI,用于绘制图形界面。当然,如果你使用了NGUI,这个生命周期的事情你就不用考虑了。
再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy。
当被禁用(enable=false)时,会执行OnDisable方法,但是这个时候,脚本并不会被销毁,在这个状态下,可以重新回到OnEnable状态(enable=true)。当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。
特别要强调的是:这里虽然可以使用C#来写代码,但是这个类构造对象的生命周期,与MonoBehaviour的生命周期,是完全不同的。
可以通过如下示例:对脚本进行验证(两个脚本添加到同一个游戏对象上):
//脚本1Monster1:
void OnBecameInvisible()
{
Debug.Log("invisible");
MonsterController mc1 = this.gameObject.GetComponent<MonsterController>();
mc1.enabled = false;
}
void OnBecameVisible()
{
Debug.Log("visible");
MonsterController mc1 = this.gameObject.GetComponent<MonsterController>();
mc1.enabled = true;
}
//脚本2MonsterController:
void Awake()
{
Debug.Log("awake");
this.enabled = false;
}
void OnEnable()
{
Debug.Log("enable");
this.enabled = true;
}
void Start()
{
Debug.Log("start");
//this.gameObject.SetActive(false);
}
void Update()
{
Debug.Log("update");
}
void OnGUI()
{
Debug.Log("gui");
}
void OnDisable()
{
Debug.Log("disable");
}
void OnDestroy()
{
Debug.Log("destroy");
}
Awake:在游戏运行时调用,用于初始化。(在Unity脚本中,绑定到组件的脚本一般不写构造函数) Start : 只在游戏开始时执行一次,在Awake()函数后执行; Update:在游戏每一帧都执行一次,在Start()函数后执行; LateUpdate:同Update,只是它会在Update()函数执行后再执行; FixedUpdate:当游戏中引入刚体系统,使用适配的方式同步物理时钟,可以让动力学更精确的计算; OnGUI:绘制游戏界面的函数,因为每一帧执行多次,所以一些时间相关的函数要尽量避免直接在其内部使用。 OnMouseOver:鼠标停留在物体上时执行该函数的内容。 OnMouseEnter:鼠标进入物体范围时执行该函数的内容。和OnMouseOver不同,该函数只执行一次。 OnMouseExit:鼠标离开物体范围时执行该函数的内容。 OnMouseDown:鼠标按下时执行该函数的内容。 OnMouseUp:当鼠标释放时执行该函数的内容。 OnMouseDrag:按住鼠标拖动时执行该函数的内容。 OnEn
OnMouse系列函数是针对指定物体的,如果要使用全局鼠标控制操作,则需要使用射线相关函数。还有很多特殊的游戏触发事件的函数,这里就不一一列出。