> 技术文档 > Unity基础学习(四)生命周期函数_unity生命周期函数

Unity基础学习(四)生命周期函数_unity生命周期函数

目录

前置小知识:

帧与帧更新的含义

​1. 帧(Frame)​​

​2. 帧更新(Frame Update)​​

3、在Unity中显示代码的打印信息的方式:

一、什么是生命周期函数

二、有哪些生命周期函数

1、​Awake()​​

2、​OnEnable()​​

3、​Start()​​

4、​FixedUpdate()​​

5、​Update()​​

6、​LateUpdate()​​

7、​OnDisable()​​

8、​OnDestroy()​​

9、​OnGUI()​​

10、OnApplicationQuit()​​​:

几组对比:

Awake()和Start():

FixedUpdate() Update() LateUpdate():

OnEnable() OnDisable():

三、总结

Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate → OnDisable → OnDestroy


前置小知识:

帧与帧更新的含义

1. 帧(Frame)​

        帧是游戏画面更新的基本单位,指一个静态的瞬时图像。游戏运行时,引擎通过连续渲染一系列帧(每秒数十次)形成动态画面。

帧率(FPS)​​:每秒渲染的帧数,例如 60 FPS 表示每秒生成 60 帧画面。帧率越高,画面越流畅。

实时性​:游戏的帧是实时渲染生成的(而非预录制),因此帧率可能因硬件性能或场景复杂度波动。

2. 帧更新(Frame Update)​

        帧更新是Unity引擎在每一帧中处理游戏逻辑的核心过程,主要通过生命周期函数(如 Update() 和 LateUpdate())实现。

Update()​​:每帧调用一次,处理实时逻辑(如角色移动、输入检测)。

LateUpdate()​​:在所有 Update() 完成后调用,处理依赖其他对象更新后的逻辑(如摄像机跟随)。

作用​:驱动游戏动态变化,确保逻辑与画面渲染同步。

3、在Unity中显示代码的打印信息的方式:

使用Debug.Log(\"打印内容\");

使用Debug.LogError(\"打印自定义报错\");

使用Debug.LogWarning(\"打印自定义警告\");

使用print(\"打印信息\");(不过这个API必须得在继承了MonoBehaviour的类中使用)


一、什么是生命周期函数

​        生命周期函数是Unity引擎在游戏对象(GameObject)或脚本的特定阶段自动调用的预定义方法。这些方法属于MonoBehaviour类,开发者通过实现它们来控制对象的初始化、更新、销毁等行为。它们的执行顺序和触发时机由Unity内部管理,无需手动调用

二、有哪些生命周期函数

注意:
生命周期函数的访问修饰符一般为private和protected

1、​Awake()​

触发时机​:脚本实例化时调用。啥意思呢,就是说当你的脚本或者对象第一次出现在场景中或者Hierarchy时候,就会调用该函数(如果你有的话)。我测试的情况是只有当你的对象处于激活状态时,才会触发

用途​:初始化变量、获取组件引用。

注意​:每个脚本仅调用一次,在OnEnable()Start()之前执行。

public class TestAwake : MonoBehaviour { private void Awake() { Debug.Log(\"Awake被调用!对象激活状态:\" + gameObject.activeSelf); }}

2、​OnEnable()​

触发时机​:对象激活(Active)或脚本组件启用(Enabled)时。

用途​:重新启用对象时的初始化(如事件订阅)。

注意​:可能多次触发(如反复激活对象)。

这个就是失活激活按键,当你的对象每次激活时便会触发这个函数。

3、​Start()​

触发时机​:对象激活后,在第一次Update()前调用。做一些初始化工作。和Awake的主要区别就是,这个是在第一帧函数更新前执行的函数,零帧启动!

用途​:依赖其他组件的初始化(如查找其他对象)。

注意​:仅调用一次,在OnEnable()之后。

4、​FixedUpdate()​

触发时机​:固定物理时间间隔(默认0.02秒)。

用途​:执行物理相关操作(如Rigidbody控制)。

注意​:频率由Time.fixedDeltaTime定义,与帧率无关。

在这里可以修改帧率:​Edit → Project Settings → Time​(时间管理器),第一个就是

Fixed Timestep​ 控制 FixedUpdate() 的调用间隔(单位:秒),值越小物理模拟越精确。

5、​Update()​

触发时机​:每帧调用一次。

用途​:处理游戏逻辑、输入检测,等需要实时监测的地方。

注意​:执行频率受帧率影响(如卡顿时调用次数减少)。

6、​LateUpdate()​

触发时机​:所有Update()执行完毕后调用。

用途​:摄像机跟随、后处理逻辑。

注意​:确保所有对象已完成本帧更新。

7、​OnDisable()​

触发时机​:对象禁用或脚本组件禁用时。这个就和前面的OnEnable()​是互补的

用途​:清理资源、取消事件订阅。

注意​:可能多次触发(如反复禁用对象)。

8、​OnDestroy()​

触发时机​:对象销毁时(如场景卸载或调用Destroy())。被销毁时想执行的内容就可以放在这里面

用途​:释放资源、销毁关联对象。

注意​:若对象未激活,可能跳过OnDisable()直接调用。

9、​OnGUI()​

触发时机​:每帧多次调用(渲染GUI时)。这个就是GUI的知识了,我们后面学习。

用途​:旧版IMGUI系统的界面绘制。

注意​:高频率调用,避免复杂逻辑。

10、OnApplicationQuit()​​​:

触发时机​:应用退出前(包括编辑器停止播放),就是游戏退出时你要执行什么。

用途​:保存数据、释放全局资源。

几组对比:

Awake()和Start():

对比项​ ​Awake()​​ ​Start()​​ ​触发时机​ 脚本实例化时(即初始创建时)。 对象激活后,在首次 Update() 前调用。 ​调用次数​ 仅一次(即使对象被反复激活/禁用)。 仅一次(对象首次激活时)。 ​用途​ 初始化变量、获取组件引用。 依赖其他组件的初始化(如查找对象)。 ​执行顺序​ 先于 OnEnable() 和 Start()。 在 OnEnable() 之后。 ​依赖激活状态​ 是 是(需对象激活)。

FixedUpdate() Update() LateUpdate():

对比项​ ​FixedUpdate()​​ ​Update()​​ ​LateUpdate()​​ ​触发时机​ 固定时间间隔(默认 0.02秒)。 每帧调用(依赖帧率)。 所有 Update() 执行完毕后调用。 ​调用频率​ 固定(与帧率无关)。 不固定(帧率高则调用频繁)。 同 Update()。 ​用途​ 物理模拟(如 Rigidbody 操作)。 游戏逻辑、输入处理、动画控制。 后处理逻辑(如摄像机跟随)。 ​时间参数Time.fixedDeltaTime(固定值)。 Time.deltaTime(上一帧耗时)。 Time.deltaTime(同 Update())。 ​示例场景​ 施加力、碰撞检测后的逻辑。 玩家移动、UI 刷新。 调整摄像机位置。

OnEnable() OnDisable():

对比项​ ​OnEnable()​​ ​OnDisable()​​ ​触发时机​ 对象/脚本激活或启用时。 对象/脚本禁用或停用时。 ​调用次数​ 多次(每次激活时)。 多次(每次禁用时)。 ​用途​ 事件订阅、激活时的初始化。 取消事件订阅、释放资源。 ​依赖激活状态​ 是(需对象或脚本激活)。 是(需对象或脚本禁用)。 ​典型配对逻辑OnEnable() 中注册事件。 OnDisable() 中注销事件。

三、总结

执行顺序简化示意:

Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate → OnDisable → OnDestroy

函数名 触发时机 使用场景 注意事项 ​Awake​ 脚本加载时(无论对象是否激活) 初始化变量、获取组件引用 仅调用一次,在OnEnable前执行 ​OnEnable​ 对象激活或脚本启用时 事件订阅、启用时初始化 可能多次触发 ​Start​ 对象激活后,首次Update前 依赖其他组件的初始化 仅调用一次,在OnEnable后执行 ​FixedUpdate​ 固定物理时间间隔(默认0.02秒) 物理相关操作(如力施加) 与帧率无关 ​Update​ 每帧一次 游戏逻辑、输入处理 受帧率影响 ​LateUpdate​ 所有Update执行完毕后 摄像机跟随、后处理逻辑 确保其他对象已更新 ​OnDisable​ 对象禁用或脚本禁用时 清理资源、取消事件订阅 可能多次触发 ​OnDestroy​ 对象销毁时 释放资源、销毁关联对象 对象未激活时可能跳过OnDisableOnGUI​ 每帧多次(GUI渲染时) 旧版IMGUI绘制 避免复杂逻辑 ​OnApplicationQuit​ 应用退出前 全局数据保存、资源释放 编辑器停止播放时也会触发