编辑器环境下,作用在场景的prefab上时,无法通过修改自定义组件的spriteFrame类型属性 同步 修改cc.Sprite的spriteFrame

  • Creator 版本:3.7.1

  • 目标平台: 无,编辑器环境。

  • 重现方式:

自定义组件:spriteSync.ts
组件功能:编辑模式下调整该组件的 sprite 属性时,同步修改 Sprite组件的 spriteFrame 属性。

import { _decorator, Component, Node, Sprite, SpriteFrame } from 'cc';
const { ccclass, property, executeInEditMode } = _decorator;

@ccclass('spriteEditor')
@executeInEditMode(true)
export class spriteEditor extends Component {
    @property({
        type: SpriteFrame
    })
    private _sprite: SpriteFrame;

    @property({
        type: SpriteFrame
    })
    public set sprite(v: SpriteFrame) {
        this._sprite = v;
        this.getComponent(Sprite).spriteFrame = this.sprite;
    }

    public get sprite(): SpriteFrame {
        return this._sprite
    };


    start() {
    }

    update(deltaTime: number) {
    }
}

首先,新建一个场景 scene.scene,通过 Create > 2D Object > Sprite 新建两个 Sprite,一个命名为 NonPrefab,另一个命名为 Prefab,然后将 Prefab 往 Asset 拖去,让它变成 预制件。
最后给他们都挂上 spriteSync 组件。(图中是 spriteEdiotr,但这不关键)

然后,同步修改两个节点上 spriteSync 组件的 sprite 属性,都改成 atom,可以看到从 Scene 窗口中看到两个节点的贴图都修改成功了。

接着保存 scene.scene,先退出该场景,然后再打开 scene.scene。

问题就出现了,NonPrefab 的 spriteFrame 依旧是 atom,那个 Prefab 的 spriteFrame 属性现在为空了。

复现Demo见附件 >>>> SpriteSyncBug.zip (23.7 KB)

  • 首个报错: 无

  • 编辑器操作系统: Windows

  • 重现概率: 100%

@magelevin


试了一下没问题 3.8.0引擎

试了一下, 3.8.0还是有问题。
你保存了之后退出场景再重新进入了吗?
3.8.0 BUG 复现视频.zip (3.0 MB)

看了你的视频复现了。
这样改一下就可以了

谢谢回复,我知道这样处理可以。
但我希望能够修复这个问题,我觉得既然手动去改 Prefab节点 的 spriteFrame 保存之后再进入场景能够正常,那通过代码不应该不行。

代码是动态改的,你要触发这个代码才行啊,直接打开又不会触发set相关的代码

image
首先、我触发这个set。
然后、我保存场景。
最后、我关闭场景再进入。
Any Problem?

@magelevin

哈哈,没问题,你继续按照你的理解来

你的理解就是错了,还哈哈呢。
按你理解,那 NonPrefab 也应该修改不成功吧。
你得按我的理解来。

你说的对,我理解错的,编辑器应该保存你的运行结果才对 :100:

你说的很对

自顶等回复

等待回复中…

等待回复中…。

等待回复中…。.

等待回复中…。…

等待回复中…。…s

@jare
关卡制作过程中,想在编辑器环境下调用方法的方式来修改 prefab实例 上的属性时,必定无法修改成功。对关卡制作带来严重不便。

不好好支持编辑器环境下的拓展。怎么提高制作效率?怎么优化调试体验?怎么丰富真正有效的插件环境?