本节要点
1.脚本生命周期简介
脚本作为我们游戏的“灵魂”,往往不单独存在,而是经常作为组件的形式挂载
到特定的游戏物体身上,比如:游戏主角,敌人,Boss,子弹,建筑物......
脚本的生命周期,也就是所挂载到的游戏物体的生命周期。
脚本的生命周期,就是挂载到的游戏物体“从出生到死亡”,所经历的一些事件。
这些生命周期事件,是一些特定的方法,且是由 Unity 引擎事先定义好的,在
游戏的运行过程中,由引擎自动调用。
这些生命周期事件,全部定义的 MonoBehaviour 这个类中。也就意味着只有
继承自这个类的脚本,才有这些生命周期事件。
2.常用生命周期事件
通过一个小的 Demo 演示,来讲解生命周期事件:
按下键盘上的某个键,然后在场景中实例化一个 Cube 物体,
这个 Cube 物体身上挂载一个脚本,用于测试它的生命周期事件。
1.Awake() ※
唤醒事件,只执行一次。
2.OnEnable()
启用事件,只执行一次。当脚本组件被启用的时候执行一次。
3.Start() ※
开始事件,只执行一次。
4.FixedUpdate() ※
固定更新事件,执行 N 次,0.02 秒执行一次。
所有物理组件相关的更新都在这个事件中处理。
5.Update() ※
更新事件,执行 N 次,每帧执行一次。
6.LateUpdate()
稍后更新事件,执行 N 次,在 Update 事件执行完毕后再执行。
7.OnGUI()
GUI 渲染事件,执行 N 次,执行的次数是 Update 事件的两倍。
8.OnDisable()
禁用事件,执行一次。在 OnDestroy 事件前执行。
或者当该脚本组件被“禁用”后,也会触发该事件。
9.OnDestroy() ※
销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。
10.注意事项
生命周期事件,全部是由系统定义好的,且系统会自动调用。
系统调用这些事件的顺序,和我们代码里面的书写顺序无关。
3.替换代码编辑器
将 Unity 自带的 MonoDevelop 替换成微软的 VS 2013 编辑器。
操作步骤:
Edit-->Preferences...-->Unity Preferences 面板--> External Tools-->External Script Editor 位置进行下拉选择设置。
关键代码
LifeTest
public class LifeTest : MonoBehaviour {
//声明一个公开的属性存放预置体
public GameObject prefabCube;
//声明一个向量去接收实例化后的游戏对象
private GameObject myCube;
void Start () {
//实例化cube
//GameObject.Instantiate(prefabCube,Vector3.zero,Quaternion.identity);
}
void Update () {
//按下空格键之后生成一个cube
if (Input.GetKeyDown(KeyCode.Space))
{
//myCube = GameObject.Instantiate(prefabCube, Vector3.zero, Quaternion.identity); //会报错,gameobject != object 所以把object强转成gameobject
myCube = GameObject.Instantiate(prefabCube,Vector3.zero,Quaternion.identity) as GameObject;
}
//按下A键销毁物体;
if (Input.GetKeyDown(KeyCode.A))
{
GameObject.Destroy(myCube);
}
}
}
CubeLife
public class CubeLife : MonoBehaviour {
//所有生命周期的函数返回值都是void
//唤醒事件,只执行一次;
void Awake() {
Debug.Log("Awake");
}
//启用事件,只执行一次,当脚本组件被启用的时候执行一次;
void OnEnable() {
Debug.Log("Enable");
}
//开始事件,只执行一次;
void Start() {
Debug.Log("Start");
}
//固定更新事件 执行N次 更新速度比UpDate速度快 所有物理组件的更新都在这个固定更新事件中执行 记住:所有物理组件更新(着重注意)
void FixedUpdate() {
Debug.Log("FixedUpDate");
}
//更新事件,每帧执行一次;
void Update() {
Debug.Log("UpDate");
}
//延迟更新事件 也是执行N次 比Update多一次 也就是N+1次 不信你试试咯
void LateUpdate() {
Debug.Log("LateUpdate");
}
//onGUI渲染事件 执行次数是Update的两倍
void OnGUI() {
Debug.Log("OnGUI");
}
//禁用事件 执行一次 在物体被禁用时触发该事件或者在OnDestroy事件前执行
void OnDisable() {
Debug.Log("OnDisable");
}
//销毁事件 执行一次 在物体销毁时执行
void OnDestroy() {
Debug.Log("OnDeStroy");
}
}