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(时间管理器),第一个就是
FixedUpdate()
的调用间隔(单位:秒),值越小物理模拟越精确。5、Update()
触发时机:每帧调用一次。
用途:处理游戏逻辑、输入检测,等需要实时监测的地方。
注意:执行频率受帧率影响(如卡顿时调用次数减少)。
6、LateUpdate()
触发时机:所有
Update()
执行完毕后调用。用途:摄像机跟随、后处理逻辑。
注意:确保所有对象已完成本帧更新。
7、OnDisable()
触发时机:对象禁用或脚本组件禁用时。这个就和前面的OnEnable()是互补的
用途:清理资源、取消事件订阅。
注意:可能多次触发(如反复禁用对象)。
8、OnDestroy()
触发时机:对象销毁时(如场景卸载或调用
Destroy()
)。被销毁时想执行的内容就可以放在这里面用途:释放资源、销毁关联对象。
注意:若对象未激活,可能跳过
OnDisable()
直接调用。
9、OnGUI()
触发时机:每帧多次调用(渲染GUI时)。这个就是GUI的知识了,我们后面学习。
用途:旧版IMGUI系统的界面绘制。
注意:高频率调用,避免复杂逻辑。
10、OnApplicationQuit():
触发时机:应用退出前(包括编辑器停止播放),就是游戏退出时你要执行什么。
用途:保存数据、释放全局资源。
几组对比:
Awake()和Start():
Update()
前调用。OnEnable()
和 Start()
。OnEnable()
之后。FixedUpdate() Update() LateUpdate():
Update()
执行完毕后调用。Update()
。Rigidbody
操作)。Time.fixedDeltaTime
(固定值)。Time.deltaTime
(上一帧耗时)。Time.deltaTime
(同 Update()
)。OnEnable() OnDisable():
OnEnable()
中注册事件。OnDisable()
中注销事件。三、总结
执行顺序简化示意:
Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate → OnDisable → OnDestroy
OnEnable
前执行Update
前OnEnable
后执行Update
执行完毕后OnDisable