有个BUG

我说两点:
1、

我不知道是我理解问题还是使用问题,你说这个没错,但是要像这种:

不加下划线滴,这样很方便策划修改,OK,这个没问题。

但是,

这种带下划线滴属性,设计之初不就是为了不能随便修改吗?所以才要加 “_” ,供脚本内部使用就行,OK,在脚本内部存在一个问题,就是在这里赋值显得毫无意义:

非得要在onLoad里再去赋下值,但是!又不是完全无意义,你第一次赋值,程序是里是会生效并且记录下来了,但是问题在于第一次记录下来后,假设你不知道在onLoad去改这个值,以后你再怎样改这个值,这个值都会是你第一次 ctrl+s 滴时候滴那个值。。这才是问题,我最开始遇到这个问题,我是一直以为Creator失灵了,因为这个情况滴发生很超乎我滴预期。当然,也许是我理解问题,我现在可能还没理解到这个中底蕴。

2、

我要为这个论坛点个赞,有2个原因:1’论坛界面、功能,做得很好,特别是这个功能,虽然不同于很多其他论坛,但真做得很好。2‘cocos 团队,正是你们每个人滴耐心回答,对每一个人滴每一个问题,让这个论坛有了生命,向他们点赞:
等等等等,我给他们点赞!

1赞

不应该在 onLoad 赋值,在 onLoad 赋值说明根本就不需要序列化,非序列化的话就不会需要重复赋值。
在 properties 中赋值私有属性,是有意义的,和公有属性一样可以提供给组件的其它使用者一些辅助信息。
并不是说编辑器不可见,就不能编辑私有属性。编辑器可以通过公有的一些 getset,或者插件直接调用组件的 API 来间接修改私有属性。

没完全理解,先大概了解到这把,非常感谢!

应该要 私有 属性就默认不序列化。
序列化没意义啊, 又不能在外部修改到。

我前面回答了,私有属性一样能修改。

哦哦。。我没看清楚

我现在大量滴使用到了不可序列化滴私有属性:

我想问一下,这样做好吗?有没有问题?或者说应不应该用另一种方式替代?这样看着很繁琐。。

可是还是算是个bug?
修改变量之后再编译对应的序列化值也应该更新才对吧

每次都重新读取,再赋值,估计编译更加慢得飞起了

在js里不用定义这些变量,直接用就行,就是全局滴,把这些都省略就好了。

这样没问题,或者你在 onLoad 时,直接赋值也可以,不用定义在 properties

什么 bug?序列化值是不会更新的,为什么要更新?

我也遇到这个问题了。从使用体验来说,个人觉得,改了后,应该保存下来,一直是之前的值,很不方便。坑

我这里有一个问题想咨询一下
首先我这边自己倒腾了一个自定义进度条,就一个类
然后预期的效果是直接将脚本挂到一个空节点上,然后创建出对应的子节点以及一套默认的参数
之后再通过属性检视面板来调整这个组件的具体属性
但是现在遇到一个很奇妙的问题——每次我保存代码之后之前设置的属性值都会被重置为默认值!
这个就有点儿搞心态了 :rofl:
无标题1
无标题2
无标题3
cus_progress.zip (1.9 KB)

抱歉没遇到过这种问题,检查一下组件的定义吧,参考下其他组件怎么写的,一般都不会这样。

我这边尝试着将 get set 改为常规定义: @property({type: T}) XXX: T = null
以这种方式定义的属性可以“固化”,但好像又有点儿不大…嗯…就感觉跟预期的效果有出入
比如我这儿有一个 BG_SPRITEFRAM 这个属性,我需要的是赋值之后对应的节点立马进行响应, 但不用 set 的话就要另外添加监听事件, 就感觉有点儿麻烦 :rofl:

get set 无法序列化的

解决了,这个操作就有点儿费解了
最初的定义是这样写的:
_bg_size: cc.Size = cc.size(300, 30);
@property({type: cc.Size, serializable: true})
public get BG_SIZE() : cc.Size { return this._bg_size; }
public set BG_SIZE(val: cc.Size) {
this._bg_size = val;
this.reSetNodeSize();
}
按道理来讲是常规写法这应该没问题,但是,_bg_size 这个字段在这里按这个方式来写就有问题了,它应该是被当成“变量”而不是“属性”了,就是说每次都会重新初始化
这里解决方式也简单,改成这样就行了:
@property({type: cc.Size})
_bg_size: cc.Size = cc.size(300, 30);

所以是否意味着只要不加 @property 修饰的字段, 默认就是变量了?

嗯,只要不加修饰器,默认编辑器就识别不出来

看这里