| name | cocos-creator-3x-cn |
| description | 提供 Cocos Creator 3.8 游戏引擎的全面开发指导,包括组件系统(_decorator、Component)、生命周期回调、事件系统(EventTarget、input)、resources 资源管理、tween 缓动系统、对象池、UI 系统、物理碰撞以及可试玩广告优化。在用户编写或重构 Cocos Creator 3.x TypeScript 代码、实现游戏功能、处理资源加载与释放、优化性能/包体大小、审查代码变更、搭建可试玩广告项目架构时触发。也适用于用户提到 import from 'cc'、Component、Node、resources、tween、director 等 3.x API 时使用。 |
Cocos Creator 3.8 开发指导技能
元信息 (Frontmatter)
快速参考 — 与 2.x 的核心差异
| 项目 | 2.x 写法 | 3.8 写法 |
|---|
| 导入 | const { ccclass } = cc._decorator | import { _decorator } from 'cc'; const { ccclass } = _decorator; |
| 组件基类 | cc.Component | Component (从 'cc' 导入) |
| 节点类 | cc.Node | Node (从 'cc' 导入) |
| 调试宏 | CC_DEBUG | import { DEBUG } from 'cc/env'; |
| 全局事件 | cc.systemEvent | import { input, Input } from 'cc'; |
| 资源加载 | cc.resources.load() | import { resources } from 'cc'; resources.load() |
| 缓动 | cc.tween() | import { tween } from 'cc'; tween() |
| 实例化 | cc.instantiate() | import { instantiate } from 'cc'; |
| 场景管理 | cc.director | import { director } from 'cc'; |
| 属性类型 | cc.Integer | import { CCInteger } from 'cc'; |
1. 组件系统 (Component System)
1.1 基础组件模板
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('MyComponent')
export class MyComponent extends Component {
@property(Node)
private readonly targetNode: Node | null = null;
@property
private readonly speed: number = 10;
protected onLoad(): void { }
protected start(): void { }
protected update(dt: number): void { }
protected onDestroy(): void { }
}
1.2 装饰器速查
| 装饰器 | 说明 | 示例 |
|---|
@ccclass('Name') | 注册 cc 类(名称全局唯一) | @ccclass('Player') |
@property | 序列化属性 | @property speed = 10; |
@property(Type) | 指定类型 | @property(Node) target: Node = null!; |
@property({type: [Node]}) | 数组类型 | children: Node[] = []; |
@integer | 整数类型简写 | @integer count = 0; |
@float | 浮点类型简写 | @float ratio = 1.0; |
@type(T) | 类型简写 | @type(Node) target = null; |
@executeInEditMode | 编辑器模式执行 | @executeInEditMode(true) |
@requireComponent(T) | 依赖组件 | @requireComponent(Sprite) |
@executionOrder(n) | 执行优先级 | @executionOrder(-1) |
@disallowMultiple | 禁止重复添加 | @disallowMultiple(true) |
@menu('path') | 添加到组件菜单 | @menu('Custom/MyComp') |
1.3 属性参数
@property({
type: Node,
visible: true,
displayName: '目标节点',
tooltip: '要跟随的目标',
serializable: true,
group: { name: '基础设置' },
})
targetNode: Node | null = null;
常用参数: type, visible, displayName, tooltip, serializable, readonly, min, max, step, range, slide, group, override, formerlySerializedAs, editorOnly
2. 生命周期回调
执行顺序:onLoad → onEnable → start → update / lateUpdate → onDisable → onDestroy
┌─────────┐ ┌──────────┐ ┌───────┐ ┌────────┐
│ onLoad │──▶│ onEnable │──▶│ start │──▶│ update │──┐
└─────────┘ └──────────┘ └───────┘ └────────┘ │
▲ │
└─────────┘
┌────────────┐
│ lateUpdate │
└────────────┘
│
┌───────────┐ ┌─────────────┐
│ onDisable │──▶│ onDestroy │
└───────────┘ └─────────────┘
| 回调 | 触发时机 | 典型用途 |
|---|
onLoad() | 节点首次激活时(仅一次) | 初始化引用、获取组件 |
onEnable() | 组件启用时 | 注册事件监听 |
start() | 第一次 update 之前(仅一次) | 需要依赖其他组件 onLoad 完成 |
update(dt) | 每帧调用 | 游戏逻辑、移动 |
lateUpdate(dt) | 所有 update 后 | 跟随相机、后处理 |
onDisable() | 组件禁用时 | 取消事件监听 |
onDestroy() | 节点销毁时 | 资源释放、清理 |
关键规则:
onLoad 中可确保节点已挂载到节点树
- 同一节点上组件的
onLoad/onEnable/start 按组件面板顺序执行,可通过 @executionOrder 控制
onEnable/onDisable 配对使用:注册/注销事件监听
onDestroy 中应释放所有动态加载资源的引用
3. 事件系统
3.1 自定义事件 (EventTarget)
import { EventTarget } from 'cc';
const eventTarget = new EventTarget();
eventTarget.on('game-over', (score: number) => {
console.log('Game Over, score:', score);
});
eventTarget.emit('game-over', 100);
eventTarget.off('game-over', callback, target);
⚠️ 注意: 不再推荐通过 Node 对象做自定义事件监听与发射。
3.2 全局输入事件 (input)
import { _decorator, Component, input, Input, EventTouch, EventKeyboard, KeyCode } from 'cc';
@ccclass('InputExample')
export class InputExample extends Component {
protected onEnable(): void {
input.on(Input.EventType.TOUCH_START, this.onTouchStart, this);
input.on(Input.EventType.KEY_DOWN, this.onKeyDown, this);
}
protected onDisable(): void {
input.off(Input.EventType.TOUCH_START, this.onTouchStart, this);
input.off(Input.EventType.KEY_DOWN, this.onKeyDown, this);
}
private onTouchStart(event: EventTouch): void {
console.log(event.getLocation());
console.log(event.getUILocation());
}
private onKeyDown(event: EventKeyboard): void {
if (event.keyCode === KeyCode.SPACE) { }
}
}
全局输入事件类型:
| 类别 | 事件类型 |
|---|
| 触摸 | TOUCH_START, TOUCH_MOVE, TOUCH_END, TOUCH_CANCEL |
| 鼠标 | MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, MOUSE_WHEEL |
| 键盘 | KEY_DOWN, KEY_PRESSING, KEY_UP |
| 重力 | DEVICEMOTION |
3.3 节点事件
this.node.on(Node.EventType.TOUCH_START, (event: EventTouch) => {
event.propagationStopped = true;
}, this);
this.node.on(Node.EventType.TOUCH_START, callback, this, true);
private onTouchStart(event: EventTouch): void {
event.preventSwallow = true;
}
3.4 自定义节点事件派发
import { Event } from 'cc';
class MyEvent extends Event {
public readonly detail: unknown;
constructor(name: string, bubbles?: boolean, detail?: unknown) {
super(name, bubbles);
this.detail = detail;
}
}
this.node.dispatchEvent(new MyEvent('custom-event', true, { data: 123 }));
4. 资源管理 (Asset Manager)
4.1 resources 加载
import { resources, Prefab, SpriteFrame, Texture2D, instantiate, Sprite } from 'cc';
resources.load('prefabs/enemy', Prefab, (err, prefab) => {
const node = instantiate(prefab);
this.node.addChild(node);
});
resources.load('images/bg/spriteFrame', SpriteFrame, (err, sf) => {
this.getComponent(Sprite)!.spriteFrame = sf;
});
resources.loadDir('textures', Texture2D, (err, assets) => { });
resources.preload('images/bg/spriteFrame', SpriteFrame);
4.2 Asset Bundle
import { assetManager, Prefab } from 'cc';
assetManager.loadBundle('gameBundle', (err, bundle) => {
bundle.load('prefabs/player', Prefab, (err, prefab) => { });
bundle.loadDir('textures', (err, assets) => { });
bundle.loadScene('level1', (err, scene) => {
director.runScene(scene);
});
});
const bundle = assetManager.getBundle('gameBundle');
4.3 资源释放
import { assetManager, resources, SpriteFrame } from 'cc';
assetManager.releaseAsset(asset);
bundle.release('image', SpriteFrame);
bundle.releaseAll();
resources.load('img/spriteFrame', SpriteFrame, (err, sf) => {
sf.addRef();
sf.decRef();
});
assetManager.removeBundle(bundle);
4.4 远程资源加载
import { assetManager, ImageAsset, Texture2D, SpriteFrame } from 'cc';
assetManager.loadRemote<ImageAsset>('https://example.com/avatar.png', (err, imageAsset) => {
const texture = new Texture2D();
texture.image = imageAsset;
const sf = new SpriteFrame();
sf.texture = texture;
});
5. 缓动系统 (Tween)
import { tween, Vec3, Node, UIOpacity } from 'cc';
tween(this.node)
.to(1, { position: new Vec3(100, 200, 0) })
.start();
tween(this.node)
.to(0.5, { scale: new Vec3(1.2, 1.2, 1) })
.to(0.5, { scale: new Vec3(1, 1, 1) })
.union()
.repeatForever()
.start();
tween(this.node)
.to(1, { position: new Vec3(0, 100, 0) })
.call(() => { console.log('done'); })
.start();
tween(this.node)
.parallel(
tween().to(1, { position: new Vec3(100, 0, 0) }),
tween().to(1, { scale: new Vec3(2, 2, 1) }),
)
.delay(0.5)
.start();
const opacity = this.node.getComponent(UIOpacity)!;
tween(opacity).to(0.5, { opacity: 0 }).start();
Tween.stopAllByTarget(this.node);
6. 节点与场景操作
6.1 节点访问
const child = this.node.getChildByName('child');
const children = this.node.children;
const childByPath = find('Canvas/UI/Button', this.node);
const parent = this.node.parent;
import { find } from 'cc';
const canvas = find('Canvas');
const sprite = this.node.getComponent(Sprite);
const sprites = this.node.getComponentsInChildren(Sprite);
6.2 节点变换
import { Vec3, Quat } from 'cc';
this.node.setPosition(new Vec3(100, 200, 0));
this.node.position = new Vec3(100, 200, 0);
this.node.setRotationFromEuler(0, 0, 45);
this.node.angle = 45;
this.node.setScale(new Vec3(2, 2, 1));
const worldPos = this.node.worldPosition;
this.node.setWorldPosition(worldPos);
6.3 场景管理
import { director } from 'cc';
director.loadScene('GameScene');
director.loadScene('GameScene', (err, scene) => {
console.log('scene loaded');
});
director.preloadScene('GameScene', (err) => {
});
director.addPersistRootNode(this.node);
director.removePersistRootNode(this.node);
7. 平台宏与条件编译
import { sys } from 'cc';
import { DEBUG, EDITOR, PREVIEW, BUILD } from 'cc/env';
if (DEBUG) { }
if (EDITOR) { }
if (BUILD) { }
if (sys.isBrowser) { }
if (sys.isNative) { }
if (sys.platform === sys.Platform.WECHAT_GAME) { }
8. 模块导入规范
import { _decorator, Component, Node, Vec3, Color, Sprite, resources } from 'cc';
import { DEBUG, EDITOR } from 'cc/env';
参考文件索引
框架参考 (references/framework/)
语言参考 (references/language/)
审查参考 (references/review/)