场景、节点、组件与生命周期
级别:首作必学。 场景描述一组对象,节点提供层级与变换,组件给节点增加行为。预制体(Prefab)是可复用的节点结构,适合卡牌、提示框等重复对象。
用最小层级组织一局
Main
└─ Canvas
├─ HUD 剩余回合、退出
├─ Board 卡牌父节点
│ └─ Card × N 牌面、编号、触摸组件
├─ ResultPanel 结果、重开
└─ GameController 规则状态与流程协调
层级表达空间与所有权,不必与后端模块目录一一对应。GameController 持有局状态;卡牌视图知道自己的 ID,把输入交回控制器;结果面板显示规则结果。
组件生命周期
| 回调 | 典型责任 |
|---|---|
onLoad | 初始化本组件、检查编辑器引用 |
onEnable | 注册可交互期间需要的监听 |
start | 首次更新前的准备,避免依赖未初始化对象 |
update(dt) | 需要持续推进的行为 |
onDisable | 解除活动期监听、停止对应任务 |
onDestroy | 清理外部引用和长寿命回调 |
不要把不同节点的 onLoad 偶然执行顺序当成依赖保证。需要依赖时显式初始化,或使用官方支持的执行顺序机制,并说明理由。
编辑器引用也是依赖
@property(Label)
turnsLabel: Label | null = null;
onLoad() {
if (!this.turnsLabel) throw new Error('GameController 缺少 turnsLabel 绑定');
}
以上放在已经导入 Label 并启用 @ccclass 的组件中;property 来自 _decorator。在属性检查器中把实际 Label 拖入字段。宁可初始化时报出明确错误,也不要让某次结算时才出现空引用。
场景切换与重开
首作可以在同一场景里重置规则状态、关闭结算面板并重新渲染。重开时取消当前盖回任务,生成新牌面和新局状态。切换场景适合进入完全不同的内容,但要同时考虑资源归属和异步加载结果。
节点 active = false 会改变组件活动状态;销毁节点也不是把所有外部服务中的引用自动清除。对外部事件总线、平台监听和全局缓存,仍需主动解绑。
练习:连续进入和退出场景,检查每次点击只触发一次业务操作。完成标准:能指出每个监听的注册点、解除点和拥有者。