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 | 对象销毁时 | 释放资源、销毁关联对象 | 对象未激活时可能跳过OnDisable |
OnGUI | 每帧多次(GUI渲染时) | 旧版IMGUI绘制 | 避免复杂逻辑 |
OnApplicationQuit | 应用退出前 | 全局数据保存、资源释放 | 编辑器停止播放时也会触发 |