核心:理解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 vs start

    • onLoad:保证组件自身依赖已就绪。用于初始化自身变量和获取直接子节点。

    • start:保证其他组件onLoad已执行。用于需要访问其他兄弟组件或父组件的逻辑。

  • onEnable/onDisable是成对的:只要注册了事件监听器,就必须onDisableonDestroy中取消注册,否则当组件禁用或节点销毁后,监听器依然存在,会导致内存泄漏和报错。

  • 使用deltaTime:在update中做移动等操作时,一定要乘以deltaTime,这样才能保证在不同帧率的设备上速度一致(帧率无关)。

  • 性能优化:对于不需要每帧更新的逻辑,可以在组件中自己设置计时器,或者通过一个标志位来控制update中的逻辑执行频率。

posted on 2025-09-16 13:20  ycfenxi  阅读(11)  评论(0)    收藏  举报