怎么修改生产预制体中的某一个图片呢?

如题,我想生成一个预制体stagecard,然后将其中cardPic这个节点的图片进行动态修改。然后写了如下代码:
(1)在游戏主逻辑中生成预制体,并为其传入参数


(2)在预制体的脚本中,当预制体生成后,根据传入的参数对自身内容进行修改

(3)预制体结构如下:

但是在实际运行后,发现报错,提示无法读取null中的spriteFrame这个属性。但是我在脚本中调用到这个属性的无论是节点cardPic还是组件Sprite都是预制体上就生成好的,并没有对其进行修改啊,为什么会找不到呢?

可能我的问题描述有一点问题,这里重新说明一下,大概就是我有一组卡牌数据(每组数据包含了这个卡牌的名字、中文名、说明、卡面图片等等),然后我要从这一组数据里抽取一个卡牌数据赋给新建的预制体。其他的信息修改方式都很简单,但是对于如何修改预制体的卡面图片我存在一些疑问。
看了一下官方文档的sprite组件相关内容,好像没有提到如何去动态修改spriteframe。然后在论坛上搜索了一下相关问题,发现大多都是采用把要修改的卡面图片作为一个cc.sprite存入脚本属性,然后在修改时直接调用这个cc.sprite。
但是针对我的这个需求,要使用哪张图片作为卡面图片是随机的,我不可能一开始就猜到要用哪张图片吧?所以就想问问,有没有直接通过url地址从素材库里调用图片的方法?

注意写法,如果是根目录在asset下的,用cc.loader.load(path, cc.Texture2d, func())
resource下的用cc.loader.laodRes()

还有,能挂载在脚本上的尽量挂载在脚本上,在动态调用getcomponent的时候成本相对较高。
ts: @property(cc.Sprite)
spImg : cc.Sprite = null
js:
properties :{
}

谢谢,我采用了根目录在assets下的方法,写了如下代码this.node.getComponent(cc.Sprite).spriteFrame.setTexture(cc.loader.load(“naoguizhaidi.jpg”,cc.Texture2d));
但是运行后报错“Cannot read property ‘x’ of null”请问是我的使用方式有问题吗?

另外能挂载我也想挂载啊,挂载的写法比直接调用简单太多了。可是我这里实在是不知道如果挂载怎么实现“随机调用图片”这个功能:joy:如果是每张图片都挂载一次那也太麻烦了吧

有问题,这是异步的,所以你得在回调函数里复制
cc.loader.load(“naoguizhaidi.jpg”,cc.Texture2d,(err, tex)=>{

this.node.getComponent(cc.Sprite).spriteFrame = new cc.Spriframe(tex)
});

我新建了一个工程测试这个用法,然后在新的工程中放置了一个sprite节点,然后给这个节点绑定了脚本,脚本内容如下:


然后运行后没有成功替换图片,报错:this.initProps is not a function。
然后我猜测是不是cc.texture2D这个类型有问题,就改成了cc.spriteFrame。运行后还是没有替换图片,报错变成了“ Failed to load resource: the server responded 7456/assets/naoguizhaidi.jpg with a status of 404 (Not Found)”
这里我知道是我资源没有读取成功,然后我又试了试把资源地址前面的“assets/”去掉,但是还是同样的问题。请问这又是怎么回事呢?
以下是我的素材位置:

建议先看一遍教程 https://docs.cocos.com/creator/manual/zh/scripting/load-assets.html?h=动态加载

好的,我正在看这篇教程,但是总觉得这一部分因为没有实际例子,所以看起来有些抽象的感觉:joy:

看你这搞的好复杂。。。其实就是从属性栏放一个spriteframe数组,js组件里设置就完事了,你可以看看官方文档的视频例子

就是在js里的properties里定义一个默认值为[],类型为spriteframe的数组,然后去组件属性编辑器那里设置数组长度,再把要放的spriteframe放进去,然后你就可以动态设置了

楼上几位可能没明白你真正需要的。。。你就以我说的为准就行了

谢谢,但是这种方法还是要手动把每张图片拖进数组里吧?因为我实现这个功能需要的图片有点多,有三种卡牌,每种卡牌有上百种卡面。如果按照这种方式来做的话,就要做三个长度上百的图片数组,光是手拖图片到数组里就要拖三四百次呢,实在太麻烦了:disappointed_relieved:我这个问题主要就是想知道有没有避开properties,直接通过路径读取图片的方法。我昨天按大佬们的说法看过教程对读取资源相关内容了,目前还在自己尝试,不过感觉应该就快搞懂这部分了:stuck_out_tongue_closed_eyes:

额,我才看到这帖的回复
你这么多图要loadres的话,drawcall会很高啊
刚才我去翻了下文档,你试试用Atlas的api吧
sprite Atlas,应该可以满足这样的需求,同张大图合批渲染不会增加drawcall