新人求解: 很小白的一个资源加载问题

cc.resources.load('textures/icon')
已知这样可以拿到一个cc.Texture2D实例

cc.resources.load('textures/icon', cc.SpriteFrame)
而这样可以拿到一张cc.SpriteFrame精灵帧

cc.assetManager.downloader._downloaders
以上基于图片资源的后缀格式是在下载器中注册过的格式

那么问题来了 图片还是那张icon.png

只不过重命名为icon.xxx后 该如何维持原接口不变
依旧可以通过cc.resources.load加载到texture和spriteFrame呢

应该是个很简单的需求吧 怎么就没人解答下呢

你是在哪重命名的,重命名为 icon.xxx 后,cocos 编辑器是否重新导入识别了。xxx 是啥

1赞

就是把图片随便改个后缀

那CocosCreator会重新识别重新生成meta文件,如果改成非图片后缀,那就无法识别了。

1赞

你是想实现什么,重命名资源后缀的操作并不常见

1赞

不是编辑器识别的问题 而是我改一个自定义的后缀 怎样才能依旧使用原本.png图片的下载和解析

举个简单例子 下载器拦截 然后使用.bin的处理方式那就可以加载到arrayBuffer数据对吧 但是如果使用.png的处理方式就只能加载到blob数据 然后解析器拦截 用parseImage的方式解析只能拿到imageBitmap

这些都太底层了 新手就只是想自定义后缀后也可以使用原来后缀的下载和解析 当然还有涉及到在这个流程中解密数据什么的

编辑器识别归识别 但是现在我告诉编辑器了这还是张png图片 给我依旧按照png的逻辑来
downloader和parser不就是做这件事的吗 拦截到之后我再解个密或干个啥的 完事之后再让下载器和解析器该干嘛干嘛

那我理解的就是去改引擎的资源处理匹配逻辑,你试试吧,我也头一次听说改后缀加密:

1赞

看文档的加载与解析章节,可以注册自定义加载与解析方法理论上支持任何后缀

1赞

他想用 resources.load 而不是 assetManager.loadAny

1赞

先获取 resources 目录下资源的 url,然后 assetManager.loadAny 试试

1赞
一开始我也以为这样那样下载器解析器注册一下就好了 但是似乎还涉及到底层的create asset
cc.assetManager.downloader.register('.xxx', cc.assetManager.downloader['downloadDomImage']);
cc.assetManager.downloader.register('.xxx', cc.assetManager.downloader['_downloaders']['.png']);
cc.assetManager.parser.register('.xxx', cc.assetManager.parser['parseImage']);

我感觉我提出的问题应该很明确吧
就是原本cc.resources.load加载.png图片 现在随便改成.xxx后缀后
依旧可以使用cc.resources.load加载

注册了以后可以用resources.load啊!这是我之前写的


1赞

可以的,我写过我确定

1赞

嗯嗯,这样可以,但是我理解的提问者意思是这样:
在 resources 的 images 下有一个 my-image.haha 这样的文件,这样调用

resources.load('images/my-image', SpriteFrame, function (err, spriteFrame) {
    self.getComponent(Sprite).spriteFrame = spriteFrame;
});
1赞

可能是我基础太差了 我搞不出cc.Texture2D和cc.SpriteFrame
大佬可以耽误几分钟时间写个加载.xxx图片吗
cc.resources.load(‘textures/icon’)和cc.resources.load(‘textures/icon’,cc.SpriteFrame)

实现注册和解析方法,download你可以参考引擎源码的downloadfile 获取到二进制如果是转png可以直接抄引擎代码!image 这样直接借助引擎的解析逻辑返回imgasset了,引擎的资源加载与解析其实很强大理论上可以支持任何自定义只不过大家不怎么用,研究一下发现很叼,公司代码只能截取不好放出来,反正思路是这么个思路

1赞

大致思路我大概清楚 之前有写过加载.xlsx的

不过图片这个我是真load不出texture和spriteFrame的cc.Asset

如果把.xxx拦截为.bin的处理方式加载 拿到arrayBuffer后自己再封装一个arrayBuffer2spriteFrame也试过可以了 但是这样就没有走cocos那一套资源加载流程了

所以我希望的是能够cc.resources.load 加载.xxx能够load出texture和spriteFrame的cc.Asset 可能确实是我太菜了吧

我的理解是downloader和parser只能处理到image元素过
至于创建cc.Asset似乎是交给factory来create的
于是我在factory里也register了.xxx后缀的创建方式 也没用

本身过于探索引擎底层就对新手没有好处
难道真的就没有大佬能够耽误短短的几分钟时间写几行代码帮助一下新手吗

问题真的不复杂 就是把.png后缀改成.xxx
然后cc.resources.load(‘textures/icon’)和cc.resources.load(‘textures/icon’,cc.SpriteFrame)
想要依旧能够加载到texture和spriteFrame

这也不算什么伸手党吧 有的时候可能真的问题很简单?但是忽视了一些点 一直搞不出来也很常见吧 希望能有热心的大佬耽误几分钟时间帮助一下新手

看上去问题简单,其实问题很不简单,png这种图片后缀名,肯定有很多处理的地方在引擎里面写死的,和额外加handler的自定义后缀名还是有区别的。
我举几个例子:1.image-asset.ts 是引擎内部的代码,里面的extnames就写死了很多图片后缀名。2.web服务器和浏览器对图片的后缀,会有固定的MIME_TYPE,也是根据后缀名判断的。
我建议尽量不要改图片后缀名,真的要改,尽量要通读引擎代码并且了解外壳(浏览器和web服务器)的图片处理方式。可能要牵涉到改引擎底层代码了。

对了。提一下,assetManager的loadAny,里面可以强制指定ext 后缀名的. 你可以试试那个能不能用

1赞