【求助】移除prefab及依赖时,怎么把公共资源留下

creator 版本:2.2.2

代码:
let deps = cc.loader.getDependsRecursively(prefabPath); cc.loader.release(deps);

当我使用上面代码移除一个不再使用的prefab时,prefab里使用的ttf字体也会被移除,
浏览器控制台会输出类似下面的log:
"res/import/84/84d47f80-591b-4a3a-b5df-8833e7e7815e.json" was released but maybe still referenced by "resources/prefab/login/LoadingLayer" (type: cc.Prefab, uuid: 5e17b57b-9d39-401d-823a-75bc66dec118)

文档里说如果想让某个资源不被移除,可以使用以下代码实现:
var deps = cc.loader.getDependsRecursively('prefabs/sample'); var index = deps.indexOf(texture2d._uuid); if (index !== -1) deps.splice(index, 1); cc.loader.release(deps);

但是这代码里的texture2d对象是怎么获取的呢?
我要怎么获取TTF字体拿到它的_uuid呢?

我现在直接复制了log里的uuid,写死了,解决了误删ttf问题。
大佬们有更好的方法,希望能指点一下。

手动顶一下

现在不光是字体文件的问题了,一些公共图片也需要从依赖列表里移除,写死uuid的方式铁定有问题。。
文档里的texture2d对象到底是怎么获取的呀:sob:
救救孩子吧:sob:

可以直接获取节点或属性的uuid, this.node.uuid or this.node.getComponent(cc.Sprite).uuid
不知是否是这个意思

应该不是吧,这里需要拿到的是资源文件的uuid,不是节点的

编辑器右键有显示uuid功能

this.node.getComponent(cc.Sprite).spriteFrame["_texture"]["_uuid"]
看看这个是不是的

楼主,你后来怎么解决的?这个问题我感觉大家都会遇到吧

TsLearn.rar (1.3 MB)看下我这个呢

cocos移除资源就是这样。
只能自己保存引用关系。
比如加载A prefab时, 引用了资源img1,img2,img3
加载B prefab时, 引用了资源img1,img2
现在移除A,但是B还在引用img1,img2。所以最终结果是只移除img3就好。
这要在load资源的时候,就保存好引用关系,在移除时判断资源是否还被其他人使用。

我现在的实现思路是这样的:
1.在启动场景里做一个常驻节点,挂个脚本上去(比如“AssetsHub.js”),负责收集公共资源对象;
2.再写个单例(比如“AssetsMgr.js”),用来收集这些公共资源的uuid;
3.这样,当prefab被移除时,就可以通过AssetsMgr将公共资源保住了~

友情提示:
1.AssetsMgr是必要的。测试发现,当切换场景引起的prefab被移除时,通过cc.director.getScene().getChildByName()的方式是获取不到常驻节点的,所以我只能通过一个单例来存储uuid。
2.图集这种资源,光存图集对象的uuid是不行的,需要遍历图集对象的_spriteFrames属性获取到每一个碎图,然后把每一个碎图的uuid缓存好;另外图集本身的png文件也要存。

大佬们看看还有别的方法没

LoadUtil