【Cocos Creator 属性声明发展史】

心得总结,也希望能给后人带来点帮助。原文链接 https://he19jkasmd.feishu.cn/docx/HTyUd2VK3ompefxmIo4crcYSnSf

发展历程

Learning

踩过的坑

  • 尽早遵循标准,避免另起炉灶

  • 使用类型系统(IDE)来帮助用户写出正确的代码,而不是在编辑态下动态校验,输出一大堆警告和报错

  • 避免在一个 API( @property )内塞入过于复杂的 JS options,运行时解析完整参数的性能开销太大

  • 用户总是写不出对的类型声明,就应该修改 API,而不是持续警告

Highlight

  • 拆分后的装饰器尽量原子化,隐式规则少,突出重要信息

  • 使用一体化的类型系统,通过完善的脚本预编译编译为多个版本,而不是将类型拆分成组件 + Extra。官方的所有类型和用户类型采用同一套类型系统。

  • 和序列化一起组成的对象模型,成为引擎强大的基建,功能对齐 Unity 并经过十年考验

  • 平稳完成从 cc.Class 到装饰器的 API 彻底升级

如果还有 Cocos Creator 4.0

  1. 移除 @property
    Cocos 用户以中重度为主,后续可以在 4.0 统一升级为新的 API 和导入方式,同时将属性装饰器彻底拆分为两个类型,将组件装饰器单独放到组件上:
// 以下装饰器均为现有实现及命名,只是调整了导入方式

import { ccclass, Component } from 'cc';

// Related Decorators on Inspector Panel or Timeline
const { editable, disallowAnimation, displayName, tooltip, multiline, 
        min, max, step, range, slide, group } = ccclass.editor;

// Serialization & Building Related Decorators
const { serializable, editorOnly, formerlySerializedAs } = ccclass.serialization;

// Component Class Decorators, 上层实现和底层解耦
const { executeInEditMode, playOnFocus, executionOrder, 
        disallowMultiple, requireComponent, menu, help, icon } = Component;
  1. 预编译脚本,解析出类型的 schema,注入编译后的 JS

    a. 直接从 TypeScript 类型系统获取类型,移除 @type (考虑使用 typedef 区分 Integer)
    b. 使用 TS public / private 关键字来判断属性默认是否可编辑( @editable )和可序列化( @serializable
    c. 使用 TS readonly 关键字判断是否只读,移除 @readonly

  2. 序列化

    a. 在类型声明上显式区分深拷贝和浅拷贝,而不是通过 ValueType 父类进行判断
    b. 允许 @serializable 传参设置特定属性如何序列化,如是否深拷贝指向的 TypedArray

12赞

《如果还有》

3赞

不愧是引擎OG 多发 爱看 :partying_face:

等到Cocos Creator4.0出来,不敢想文档会有多乱

4赞

unity有6.0,CC也会有4.0的

1赞

看到没有,就一个@property,就不同版本不同玩法,3.x这样的,到4.x就没了,你让新手怎么学习。

无论如何发展就是好事,但是没人能明白我现在同时开发维护3.x和2.x的项目,如果没有AI辅助,我都不敢想我脑子有多乱

1赞

学个2.x的教程,装个3.x的,诶,怎么报错了。
学个3.x的教程,装个4.x的,诶,怎么报错了。

2赞

会有4.0的

1赞

看到2017年版本1.5泪目了。曾经的我:死抠语法、代码提示(cc._decorator的下划线难受了很久);现在的我:语法能用就好、关注性能和稳定。
关于第2点建议,我感觉TS设计的语法表达能力可能无法达到引擎这么多细分功能的需求。例如经常会遇到,protected、private关键字我只是不想让别的类来访问这个字段,但是这个字段本身挂在节点上时我可能还是想在Editor中编辑和序列化初始值的,而有些public的字段却可能是我想让别的类访问但不需要在Editor中编辑的。

2赞

是否序列化或者是否在编辑器中可见,可以通过装饰器声明的

表示Cocos直接上7.x,unity能行的,我也行。unity不行的,我还是行。

我有点记不清了,印象中第一个用TS写Cocos代码的就是你吧?

1赞

2013年那时unity和cocos都很火,我选择了cocos然后买了一本cocos2dx 游戏编程指南,书还没看完,,然后cocos 新版本api之类的全改了,一怒之下我把书扔了,买了unity书,,,哎,无语

2赞

能出项目,项目能赚钱就行。其他都不重要

属性声明这个东西一定要放在脚本里吗?做到编辑器里怎么样?

这是你们的KPI吗? 不整点变化,搞点代码量,老板是不是扣工资的。。。。。

OG啥意思,OldGay?

你是懂英文缩写的 :rofl:

如果搞4.0,希望能尽可能靠近最新JS/TS标准,并且尽可能和前端生态融合,比如编译工具链尽可能使用Vite和VoidZero项目生态中的东西。如果cocos组件生命周期能结合@vue/reactivity做状态同步就更完美了。