3.3.2 Prefab 无法修改 Node 和 UITransform 以外其它 Component 的属性

Creator 版本:

  • 3.3.2

目标平台

  • Chrome

重现方式:

  1. 创建一个 Prefab,内含一个自定义组件,包含 2 个自定义属性。:
  2. 在场景中拖拽进 2 个上述 Prefab,修改位置,并在编辑器中修改属性 a b 的值。
@property
a: number = 100;

@property
b: string = 'xxxx'

期望表现

  • 2 个 Prefab 实例拥有不同的位置,及不同的 a b 属性

实际表现:

  • 2 个实例拥有不同的位置,但 a b 属性的赋值未生效,a b 还是 Prefab 内的初始值。

建议

  • 除 Node 本身和 UITransform 外,Prefab 上其它组件的属性也支持覆写。
    • 相当于实例各组件的实际属性值 = Object.assign(实例覆写值, Prefab 原始值)
  • 可通过属性名的颜色来标识,该属性是由实例覆写的,还是 Prefab 的原始值,并提供一个属性级别的 “回滚” 按钮以清除覆写。
  • 可以参考 Figma,它的组件和实例即是上面这种关系,可以自由覆写任意属性,非常灵活好用。

我这边测试是有效果的,发个demo看一下?

项目 Demo

cocos-332-prefab-issue.zip (22.2 KB)

重新步骤

  1. 拖拽 3 个 prefabs/ChatBox 到主场景中
  2. 分别修改 3 个 ChatBox 示例的 RoomName 属性,如下图
  3. 点击运行

ChatBox 组件脚本如下:


import { Component, Label, _decorator } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('ChatBox')
export class ChatBox extends Component {

    @property
    roomName = '';

    @property(Label)
    labelTitle!: Label;

    start() {
        this.labelTitle.string = '🟢 ' + this.roomName;
    }

}

期望结果

实际结果

如果断开 Prefab 连接,修改属性 -> 保存,则出现实际结果。

查了一下,发现你这个ChatBox的Prefab里的ChatBox这个自定义Component身上的’__prefab’属性空了,不知道你是怎么操作出来的。
解决方法是:把ChatBox再拖出来覆盖一下就好了。

感谢~
这个 Prefab 是从 3.0 升级上来的,不确定是否跟这个有关

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。