如上所示,在编译器脚本属性中会有 gameFrameCoinPrefab属性,拖入prefab后,编译器 打出“xxxxxx”的日志,表明 set 执行了,在程序运行时,能够 通过 get 拿到 gameFrameCoinPrefab。
但是很奇怪的一个问题是 this._name2prefabMap.size 为0。
请教一下各位大神,为啥呢?
如上所示,在编译器脚本属性中会有 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楼说的跟表现
差不多,但这个正式我的疑惑点。
编辑器有执行啊
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这个文档里面没有这种
Ts写类型的话大多数情况都是这样:
@property(cc.Prefab)
test: cc.Prefab = null;
另外要用notify的话,那就只能用js去写了,ts不支持notify方法