请教下预制物动态更换文理的bug

最近一个项目中用到了prefab,碰到了一个非常匪夷所思的BUG
克隆了两个prefab(精灵类型),分别调用setTexture替换纹理,但替换后的运行结果是两个prefab的纹理都是一样的,请问这是为啥啊?贴上简单示意代码:

// 定义
properties: {
        pretest: cc.Prefab,
    },

// 调用
var item1 = cc.instantiate(this.pretest);
item1.getComponent('cc.Sprite').spriteFrame.setTexture(cc.textureCache.addImage(cc.url.raw("resources/1.png")));
addChild(item1);
        
var item2 = cc.instantiate(this.pretest);  item2.getComponent('cc.Sprite').spriteFrame.setTexture(cc.textureCache.addImage(cc.url.raw("resources/2.png")));
addChild(item2);

运行结果是item1和item2的纹理都是2.png了

求大神们指教!

因为这两个 Prefab 所用的 spriteFrame 是相同的,所以当你修改了其中一个时,另一个也会跟着修改。
建议直接加载 SpriteFrame,而不是通过 texture 自己初始化 SpriteFrame。

直接加载SpriteFrame,也就是说Prefab不能够设置texture了?这样的设计不太合理啊,个人感觉应用场景还是很多的!
我现在要做一个翻牌的效果,三个动作组成,动作1和动作3分别是X轴的缩放变化,动作2是一个callback函数,把牌的背面换成正面,这个地方就要用到setTexture……
下个版本会修正这样的设计吗?

你想直接用 texture 当然可以,那么我建议你这样用:
item1.getComponent(‘cc.Sprite’).spriteFrame = new cc.SpriteFrame(cc.url.raw(“resources/1.png”));

1赞