开发习惯规范

1. Button 事件监听

开发时如果遇到 XQButtoncc.Button 类型,添加点击监听事件时统一使用以下写法:

1
this.btn.node.on("click", this.onClick, this);

约束

  • 统一使用 on("click", handler, this) 形式绑定。
  • 第三个参数必须传 this,保证回调上下文正确。
  • 禁止省略上下文参数或改为匿名函数包装。

2. @property 节点空值检查

对于使用 @property 装饰器声明的属性(通常是编辑器绑定的节点或组件),在代码中使用时不要添加空值判断

规范

  • 错误写法

    1
    2
    3
    4
    5
    6
    7
    8
    @property(cc.Node)
    myNode: cc.Node = null;

    start() {
    if (this.myNode) { // ❌ 禁止这种防御性编程
    this.myNode.active = true;
    }
    }
  • 正确写法

    1
    2
    3
    start() {
    this.myNode.active = true; // ✅ 直接调用,如果为空直接报错
    }

原因

  • 这些属性预期必须在编辑器中挂载。
  • 如果运行时为空,直接抛出异常(NullPointerException)能第一时间暴露“忘记挂载节点”的问题。
  • 添加空值判断会掩盖配置错误,导致功能静默失效,增加排查难度。

3. 多语言调用方法

需要使用多语言文案时,统一通过以下方式获取:

1
GlobalObjectMgr.instance.localizedTextHelper.getLocalString("");

约束

  • 统一使用 GlobalObjectMgr.instance.localizedTextHelper.getLocalString(key)

4. 动画实现方式

需要实现动画效果时,统一使用 cc.tween 方法。

1
cc.tween(node).to(0.3, { scale: 1.1 }).start();

如有异步串行动画需求,统一使用:

1
await asyncMgr.tween(cc.tween(node).to(0.3, { scale: 1.1 }));

约束

  • 普通动画统一使用 cc.tween(...).start()
  • 异步场景统一使用 asyncMgr.tween(cc.tween(...)),异步方法调用不需要调用 start()

5. 弹窗节点复用规范

继承 WindowBaseUIBase 的脚本属于弹窗界面。

生命周期说明

  • 节点一般情况下不会销毁。
  • 每次打开弹窗都会调用 refreshUI

开发约束

  • 节点尽量避免“销毁后再创建”的实现方式。
  • 如果存在动态创建节点并维护数组的场景,不要在每次 refreshUI 时清空并重建。
  • 首次创建后应缓存到数组中,后续 refreshUI 直接复用数组内节点,仅更新显示状态和内容。
  • 仅在确实需要时补充新增节点,已有节点优先复用。