第四课、 TypeScript 中 Cocos 的生命周期
核心:理解Cocos引擎何时调用你的脚本方法,是正确编写游戏逻辑的基础。
TypeScript类继承自cc.Component
,其生命周期由引擎自动管理。你通过重写(override)特定方法,在正确的时机执行你的代码。
一、Cocos的主要生命周期回调(按执行顺序)
方法名 | 描述 | 常用用途 |
---|---|---|
onLoad | 组件首次激活时调用,在start 之前。通常此时节点和组件都已初始化完毕。 | 初始化:获取节点引用、缓存变量、初始化数据。这是最常用的初始化位置。 |
start | 在组件第一次激活前,也就是第一次执行update 之前触发。 | 初始化:需要依赖其他组件初始化逻辑(例如获取其他节点的组件)。在onLoad 之后执行。 |
update | 每一帧渲染前调用,频率取决于游戏帧率。 | 游戏核心循环:处理移动、输入、计时等随时间变化的逻辑。 |
lateUpdate | 在所有update 调用结束后执行。 | 跟随逻辑:例如相机跟随玩家,确保在玩家移动后再更新相机位置。 |
onEnable | 每当组件变为启用 状态时调用。 | 启用时的处理:注册事件监听器、显示UI、恢复游戏逻辑。 |
onDisable | 每当组件变为禁用 状态时调用。 | 禁用时的清理:取消事件监听器、隐藏UI、暂停游戏逻辑。这是防止内存泄漏的关键! |
onDestroy | 当组件被销毁时调用。 | 最终清理:释放非引擎管理的资源、清除定时器等。 |
二、Cocos的生命周期流程图(非常重要)
加载节点/组件 -> onLoad -> (节点首次激活) -> onEnable -> start -> (每帧) update -> lateUpdate -> ...
-> (组件被禁用) -> onDisable -> (组件再次启用) -> onEnable -> ...
-> (组件被销毁) -> onDisable -> onDestroy
三、TypeScript中的代码示例
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;@ccclass('PlayerComponent')
export class PlayerComponent extends Component {@property(Node)private target: Node | null = null; // 声明节点引用private _moveSpeed: number = 0;// 1. onLoad - 初始化onLoad() {console.log('Component is loaded!');// 通常在这里获取节点或组件if (this.target) {// 缓存一些初始信息}this._moveSpeed = 10; // 初始化数据}// 2. onEnable - 启用时onEnable() {console.log('Component is enabled!');// 注册游戏事件,例如触摸、键盘监听// input.on(Input.EventType.KEY_DOWN, this.onKeyDown, this);}// 3. start - 第一次激活前start() {console.log('Start is called!');// 可以访问其他组件的数据,因为其他组件的onLoad可能已经执行完毕}// 4. update - 每帧更新update(deltaTime: number) { // deltaTime 是上一帧到当前帧的时间间隔if (!this.target) return;// 移动逻辑,使用deltaTime保证帧率无关的运动// let pos = this.target.position;// pos.x += this._moveSpeed * deltaTime;// this.target.setPosition(pos);}// 5. onDisable - 禁用时onDisable() {console.log('Component is disabled!');// **重要!** 取消事件注册,防止重复注册和内存泄漏// input.off(Input.EventType.KEY_DOWN, this.onKeyDown, this);}// 6. onDestroy - 销毁时onDestroy() {console.log('Component is destroyed!');// 进行最终的资源清理}
}
四、实践重点与常见陷阱
onLoad
vsstart
:onLoad
:保证组件自身依赖已就绪。用于初始化自身变量和获取直接子节点。start
:保证其他组件的onLoad
已执行。用于需要访问其他兄弟组件或父组件的逻辑。
onEnable/onDisable
是成对的:只要注册了事件监听器,就必须在onDisable
或onDestroy
中取消注册,否则当组件禁用或节点销毁后,监听器依然存在,会导致内存泄漏和报错。使用
deltaTime
:在update
中做移动等操作时,一定要乘以deltaTime
,这样才能保证在不同帧率的设备上速度一致(帧率无关)。性能优化:对于不需要每帧更新的逻辑,可以在组件中自己设置计时器,或者通过一个标志位来控制
update
中的逻辑执行频率。