已知bundle名称与bundle下资源路径,如何获取资源的nativeUrl?

如题,在 cocos 3.8.3 中,如何在知道bundle名称与bundle下资源路径,但是未加载资源的情况下,解析出对应的nativeUrl?

应用场景:判断目标资源是否已经下载,如果未下载需要展示进度条(加载过程不展示进度条)。

【无效方案】

transformNativeUrl(bundleName: string, path: string): string {
    let bundle = assetManager.getBundle(bundleName);
    if(!bundle) return null;

    let info = bundle.getInfoWithPath(path);
    if(!info) return null;

    let options = {
        bundle: bundleName,
        __isNative__: true,
        ext: info.extension,
    };

    return assetManager.utils.transform(info.uuid, options) as string;
}

返回结果:xxxx/native/xxxx .json
尝试在bundle.getInfoWithPath接口传入具体的资源类型,返回结果后缀依然是.json,与实际不符。

补充

image

通过断点可知,引擎内部是通过解析 import 文件获取的扩展名,但没有直接使用的接口:目前看需要先自行加载 import 文件,然后再调用assetManager.parser.parse进行解析。
image

有没有大佬有其他解决方案可以提供一下呢?

老哥找到获取资源后缀的办法了没

assetInfo里不包含文件后缀的吧 好像只能加载资源后通过_native属性知道 再底层就是文件系统了吧

不过在自己知道文件后缀的情况下获取nativeUrl应该是可以的
我用的2.x也是通过楼主上面的方案然后手动替换json为指定后缀

这玩意就是个url转换 并不带识别的 所以我觉得肯定要自己替换的吧

没有实现,我目前的需求只需要确定文件的存放位置(temp、cache),所以直接使用importurl指向的文件进行替代判定了。

有一个理论可行的方案就是我前面有提到的,通过读取import文件再解析,内部是带有实际的扩展名的:

  1. 先获取importUrl,如果importUrl不存在则直接返回null;
  2. 通过importUrl获取本地存储位置,读取Import文件内容(可能需要多平台适配);
  3. 使用 assetManager.parser.parse 接口获取原始文件的扩展名。
    • id: ${uuid}@import
    • file: import文件内容
    • type: ‘import’
    • options: { priority: 0, cacheBundleRoot: ${bundleName}, uuid: ${uuid} }
    • onComplete: (err, data) => void; // data._native 字段即为原始资源的真正扩展名

因为这边涉及到异步操作,但我的需求是需要同步完成的;所以这个方案我还没有验证过,只是通过翻阅源码推测出的方案,有需要可以试试。

没有找到办法,曲线救国,把需要操作的资源后缀手动定义出来 :sweat_smile:
不想一个个写 就用nodeJs写个脚本遍历所有文件 把后缀写到一个json里面去,然后再去读取

简单有效 :grinning:

资源预处理永远是最方便的方案,很多运行时没法做的,就用打包系统或者编辑器插件,预处理成配置就可以了。
就lz那个问题,就可以预处理一张资源反查表就行。

有考虑过资源反查的思路,但是由于项目中采用了多种纹理压缩格式(png、astc等),针对于不同型号的手机,下载的资源格式是不一样的,然后没找到api去获取具体对应的纹理格式具体是哪种,就放弃了。

如果是单一纹理格式,的确是反查最简单。

说个题外话,现在不支持astc的手机也极少了。我基本上都是只打astc的,没碰到过不兼容的。

这就看项目需求了,目前的确astc是主流,如果不需要兼容低端设备一般是够用的。

加载时的类型填 ImageAsset imageAsset下的nativeurl是有值的 然后const texture = new Texture2D();
texture.image = imageAsset;
const spriteFrame = new SpriteFrame();
spriteFrame.texture = texture;
转一下就能获得精灵文件了 nativeurl自己设一下值进去 或者自己保存一下就好了

:joy:

:rofl:审题大失败