Unity 的生命周期(Life Cycle)是指 Unity 在运行游戏时对每个脚本调用的一系列方法顺序。理解生命周期能帮助你在合适的时机执行初始化、逻辑处理、渲染、清理等操作。
下面是 MonoBehaviour(Unity脚本的基类)生命周期函数的执行顺序与作用:
🟡 1. 初始化阶段(只调用一次)
Awake()
- **作用**:对象实例化后最先被调用。
- **特点**:即使脚本被禁用,也会被调用。
- **用途**:设置变量的初始值、加载资源、注册事件等。
- **注意**:其他脚本可能还没执行
Awake()
,避免依赖其他组件的状态。
void Awake() { Debug.Log("Awake 被调用"); }
OnEnable()
- **作用**:当脚本启用(enabled = true)或 GameObject 激活时调用。
- **用途**:可以注册事件、启动协程等。
void OnEnable() { Debug.Log("OnEnable 被调用"); }
Start()
- **作用**:在
Awake()
后、在第一帧Update()
前调用。 - **特点**:只在脚本启用状态下执行一次。
- **用途**:用来访问其他组件、开始游戏逻辑等。
void Start() { Debug.Log("Start 被调用"); }
🟢 2. 游戏循环阶段(每帧调用)
Update()
- **作用**:每帧调用一次。
- **用途**:处理输入、移动、计时器、状态更新等逻辑。
- **执行频率**:受帧率影响,帧率越高,调用越频繁。
void Update() { Debug.Log("Update 每帧调用"); }
LateUpdate()
- **作用**:在所有
Update()
调用后执行。 - **用途**:适合处理摄像机跟随、骨骼动画等依赖其他更新后的逻辑。
void LateUpdate() { Debug.Log("LateUpdate 每帧调用"); }
FixedUpdate()
- **作用**:按照固定时间间隔调用,与物理系统同步。
- **用途**:用于物理相关的处理(刚体运动、碰撞检测等)。
- **注意**:受 Time.fixedDeltaTime 控制,不随帧率变化。
void FixedUpdate() { Debug.Log("FixedUpdate 用于物理更新"); }
🔴 3. 暂停/禁用阶段
OnDisable()
- **作用**:当脚本被禁用或对象失活时调用。
- **用途**:注销事件、停止协程、防止内存泄漏等。
void OnDisable() { Debug.Log("OnDisable 被调用"); }
⚫ 4. 销毁阶段
OnDestroy()
- **作用**:对象被销毁时调用。
- **用途**:释放资源、断开连接、清理引用。
void OnDestroy() { Debug.Log("OnDestroy 被调用"); }
✅ 附加说明
OnApplicationQuit()
- **作用**:在退出游戏时调用(仅限 PC、Mac)。
- **用途**:保存数据、断开网络、清理资源等。
🔁 生命周期完整流程图示(启用对象):
Awake() → OnEnable() → Start() → Update() / FixedUpdate() / LateUpdate() 循环执行 → OnDisable() → OnDestroy()
🔄 生命周期总结表格
方法 | 调用时机 | 每帧调用 | 是否可禁用触发 |
---|---|---|---|
Awake | 对象实例化时 | 否 | 是 |
OnEnable | 脚本启用时 | 否 | 是 |
Start | 第一次 Update 之前 | 否 | 否 |
Update | 每帧调用 | 是 | 否 |
LateUpdate | 每帧最后执行 | 是 | 否 |
FixedUpdate | 每固定时间执行 | 是 | 否 |
OnDisable | 脚本禁用时 | 否 | 是 |
OnDestroy | 对象销毁时 | 否 | 是 |
OnApplicationQuit | 应用退出时 | 否 | 是 |