请教大神:脚本属性 set/get拖进去序列化后的资源如何追踪统计

如上所示,在编译器脚本属性中会有 gameFrameCoinPrefab属性,拖入prefab后,编译器 打出“xxxxxx”的日志,表明 set 执行了,在程序运行时,能够 通过 get 拿到 gameFrameCoinPrefab。

但是很奇怪的一个问题是 this._name2prefabMap.size 为0。

请教一下各位大神,为啥呢?

是因为脚本程序在运行后,读取json值之后,并没有执行 这个属性的set 么,但是如果没有执行这个set,程序中又如何 拿到 gameFrameCoinPrefab的?
这样岂不是引擎的bug了?

引擎直接赋值的_gameFrameCoinPrefab,没走set,非序列化的值,游戏运行后都是初始值

从表现和运行结果来说,是你说的这样。但这正是我现在疑惑的点。 creator既然提供了 属性的set/get,为什么在脚本实例化的时候,又不去执行 它的set

这种情况至少违背了我的直观认知了

你的_name2prefabMap是个Map对象?Creator目前还不支持Map对象哦,Map对象现在是不会被序列化的。

建议优先使用数组类型。

字典类型也可以,不过字典的话没法在编辑器上面显示

    @property
    dictionary: { [key: string]: cc.Prefab; } = {};

其实我的问题不是这个map对象能否序列化的问题,这个map我只是用来做一个键值对映射。 我的问题是 在编译器中拖进来的prefab,为什么在脚本初始化数据的时候,没有执行这个属性的 set,但是却能够通过get 拿到这个值。 2楼说的跟表现
差不多,但这个正式我的疑惑点。

@BigBear

编辑器有执行啊

    private _test: string = '';

    @property
    set test (value: string) {
        cc.log('set test: ' + value);
        this._test = value;
    }
    get test (): string {
        return this._test;
    }

我明白你的意思了,就像我上面写的setter getter一样,序列化的时候只会保存_test的值,反序列化的时候也是直接给_test赋值。

test并不是一个属性,虽然它在使用的时候像一个属性,可以通过this.test的方式去使用,但本质上它是属性的获取or设置 方法,它是一个 方法,不是属性,所以不会被序列化。

如果你想在赋值的时候进行方法的调用,推荐使用notify方法,不过notify方法不支持ES6的写法

谢谢,我懂你的意思了。

顺便再问一下,ts 怎么写这种多个属性参数,例如

这种就报错了,我该怎么写他的type:cc.Prefab,用时,写它的 notify方法呢?

Ts这个文档里面没有这种

@BigBear

Ts写类型的话大多数情况都是这样:

@property(cc.Prefab)
test: cc.Prefab = null;

另外要用notify的话,那就只能用js去写了,ts不支持notify方法