Unity脚本生命周期

一、概述

Unity脚本生命周期是指在Unity游戏引擎中,脚本在运行过程中所经历的各个阶段。下面请观看Unity脚本生命周期的各个阶段的详细介绍。

1
2
Unity官网地址:
http://docs.unity3d.com/Manual/ExecutionOrder.html

二、脚本生命周期

第一阶段:Reset

当脚本(Scripts)第一次绑定到物体上或者点击重置(Reset)按钮的时候会触发,且只有在编辑(Editor)模式下触发,游戏打包的时候不会触发

下面将用代码的形式进行演示,新建一个C#脚本,并添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
private void Reset()
{
Debug.Log("Reset");
}

这里我们点击重置(Reset)按钮,会发现控制台(Console)打印出了’Reset’

我的图片

第二阶段:Awake

当脚本实例在游戏中运行被载入时运行,一般为了初始化游戏变化和游戏的状态。(注:无论脚本是否激活,Awake函数都会执行。但如果脚本挂载的物体处于未激活状态,Awake是不会执行的)

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
private void Awake()
{
Debug.Log("Awake");
}

这里我将脚本状态切换成未激活状态,会发现控制台(Console)依旧打印出了’Awake’

第三阶段:OnEable

在游戏对象是可激活状态的时候会调用(当脚本从未激活状态转换为激活状态是就会调用OnEable)

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
private void OnEnable()
{
Debug.Log("OnEnable");
}

在游戏运行的时候,我们将未激活的脚本切换为激活状态,可以看到这是控制台才打印出’OnEnable’

第四阶段:Start

Start方法也是为了初始化变量和游戏的状态,但是和Awake有些许不同之处。Awake方法是在项目初始化的时候调用的,但Start方法可能在初始化之后被调用,这就导致会有一些函数在Start之前执行,造成空引用的情况。(注:如果脚本不处于激活状态,Start是不会被调用的,但是Awake无论是不是激活都会被调用)

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
5
6
7
8
9
10
11
12
13
private void Awake()
{
Debug.Log("Awake");
}

private void Start()
{
Debug.Log("Start");
}
private void OnEnable()
{
Debug.Log("OnEnable");
}

这里我对上述几个方法执行的先后顺序进行了对比,结果如下

第五阶段: FixedUpdate

所有物理行为的每帧更新的逻辑都应放在FixedUpdate里面,因为这个是用固定间隔的帧率执行的。而普通的Update方法每一帧之间的执行间隔不是一样的(不均匀),这样回导致一些物理运动出现卡顿的情况

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
private void FixedUpdate()
{
Debug.Log(Time.deltaTime);
}

这里可以看到打印出的结果是没有任何帧率上的波动的

第六阶段:OnTrigger、OnCollision、OnMouse

这三个方法在FixedUpdate之后依次执行,执行顺序为先处理触发器行为(OnTrigger)再处理碰撞行为(OnCollision)最后处理鼠标点击输入的行为(OnMouse)

第七阶段:UpDate

每一帧进行调用,是实现游戏逻辑的主要方法。在这个阶段,脚本可以进行一些更新操作,例如移动游戏对象、检测碰撞等,但就如之前所说Update方法每一帧之间的执行间隔不是一样的

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
private void Update()
{
Debug.Log(Time.deltaTime);
}

结果如下

第八阶段:LateUpdate

在所有Update方法执行之后才执行,一般用于摄像机的跟随移动。例如

将人物移动和摄像机都放到Update方法里执行,可能会出现摄像机移动先移动出去,之后人物才跟随上来的画面撕裂感,所以一般会把摄像机移动放在LateUpdate,让它跟人物移动有些许间隔。

第九阶段:OnGUI

处理GUI数据,也是每一帧执行一次,执行的次数是 Update 事件的两倍。在这个阶段,脚本可以进行一些GUI绘制操作,例如绘制按钮、文本等。

第十阶段:OnDisable

当对象被取消激活状态的时候响应,和OnEnable相对应,但与此同时对象再次被激活的时候,OnEnable也会再次响应

下面将用代码的形式进行演示,脚本中添加以下代码,然后将其挂到任意的游戏对象上

1
2
3
4
5
6
7
8
private void OnEnable()
{
Debug.Log("OnEnable");
}
private void OnDisable()
{
Debug.Log("OnDisables");
}

结果如下

第十一阶段:OnDestory

在对象被销毁的时候调用,但是如果一开始对象就处于未激活状态然后被销毁了,就不会调用这个函数

三、结束

到这里就是最常使用的几种生命周期方法。还有很多种的生命周期方法,这里没有写全,如果有需要可以更多的相关内容,可以点击这里MonoBehaviour API 地址 查阅Unity的相关文档。