我写了一个颜色渐变组件,拥有Color类型的属性BeginColor和EndColor,在编辑器中修改颜色后,当我切换到别的场景/预制体后,再切换回来,编辑器中的颜色又恢复成修改之前的颜色了,从git的改动情况可以看到,场景的数据其实已经变了,但UI的数据不知为什么一直恢复成旧值。在浏览器中运行的时候显示的也是旧的颜色,重启编辑器、删除temp目录都没有效果。
我写了一个颜色渐变组件,拥有Color类型的属性BeginColor和EndColor,在编辑器中修改颜色后,当我切换到别的场景/预制体后,再切换回来,编辑器中的颜色又恢复成修改之前的颜色了,从git的改动情况可以看到,场景的数据其实已经变了,但UI的数据不知为什么一直恢复成旧值。在浏览器中运行的时候显示的也是旧的颜色,重启编辑器、删除temp目录都没有效果。
看看组件的代码里是不是赋值写死了
组件代码比较简单,就是将颜色传递给材质,没有写死什么颜色
export class GradienColors extends Component {
@property(CCFloat)
angle = 0;
@property(CCFloat)
offset = 0;
@property(CCFloat)
uvRatio = 1.0;
@property(Color)
beginColor: Color = Color.BLUE;
@property(Color)
endColor: Color = Color.MAGENTA;
onLoad() {
this.updateContent();
}
private updateContent() {
const renderComponent =
this.getComponent(Sprite) || this.getComponent(Label) || this.getComponent(UIRenderer);
if (renderComponent) {
const material = renderComponent.getMaterialInstance(0);
if (material) {
material.setProperty(‘angle’, this.angle);
material.setProperty(‘offset’, this.offset);
material.setProperty(‘uvRatio’, this.uvRatio);
material.setProperty(‘beginColor’, this.beginColor);
material.setProperty(‘endColor’, this.endColor);
}
}
}
}
浏览器跑起来也是不对的吗,编辑器里生效需要在类名上面增加装饰器enableinedit好像是这个具体看一下文档
浏览器跑起来也不对,我另外新建了一个demo工程来验证,发现color属性又是可以正常修改的,不知道我现在这个项目的color属性触发了什么神奇的bug
嵌套了预制体吗?嵌套预制体会有这种情况,预制体里面有个数据被置成了null
你这个Label可以用?我看了下Label下的MaterialInstance是空的,sprite正常
已经定位到具体原因,我的页面同时存在两个GradienColors组件,由于beginColor的默认值是Color.BLUE,意味着两个组件的beginColor是同一个Color对象,当在编辑器里面修改颜色属性值的时候,最后修改的总会覆盖了前面的,导致两组件的颜色都是共同变化,在新版本中给默认值的时候要通过new来创建一个新对象,这样不同组件的同名属性就不是共用的了。这个默认值的写法在旧版本没有问题,新版本才会有问题。@boyue