请问如何动态解析下载的atlas的PNG和Plist?

  • Creator 版本: 3.8
  • 目标平台: 微信

请问:
我的游戏有后端, 在服务器放置若干atlas, 随着游戏更新,我希望不需要更新版本就能更新这些atlast,可以直接用web请求远程下载这两个文件,但是我不知道下载之后应该如何解析成SpriteAtlas并动态使用其中的SpriteFrame?

提前感谢!

PS. 哪位大佬有cocos的群可以加一下,刚失业入cocos坑不久, 业务逻辑开发基本完成,虽然发现很难,但是也跑不掉了 :rofl:

3.x没有实际用过该方法,你参考下

loadPlist() {
// 远程获取plist文件(JsonAsset)和图片文件(ImageAsset)后
    const texture = new Texture2D();
    const sa = new SpriteAtlas();
    texture.image = image; // 你获取的ImageAsset
    const frames = asset.frames; // asset为你获取的plist的内容 plist._nativeAsset
    const sfs = sa.spriteFrames;
    const plistRegex = /[,{}\s]+/;
    const tmpRect = rect();
    const tmpSize = size();
    for (const key in frames) {
        const sf = new SpriteFrame();
        const frame = frames[key];
        sf.texture = texture;
        let tmp: string[] = frame.frame.split(plistRegex, 5);
        sf.rect = tmpRect.set(parseInt(tmp[1]), parseInt(tmp[2]), parseInt(tmp[3]), parseInt(tmp[4]));
        tmp = frame.offset.split(plistRegex, 3);
        sf.offset = tmpRect.set(parseInt(tmp[1]), parseInt(tmp[2]));
        tmp = frame.sourceSize.split(plistRegex, 3);
        sf.originalSize = tmpSize.set(parseInt(tmp[1]), parseInt(tmp[2]));
        sf.rotated = frame.rotated;
        sfs[key.slice(0, -4)] = sf; //key需要去掉后缀.png
    }
}

1赞

2.x 的,
https://forum.cocos.org/t/topic/152641

十分感谢, 我试一下, 这两天我还看了下一个2.4的例子,

如果是直接从remote加载PNG, 现在看使用AssetManager.loadRemote应该直接可以用, 但是还想做一下资源加密, 将PNG传输中做一下加密。
所以实际上现在直接拿不到ImageAsset,而是
AssetManager.load(remote) ==>
string -> Enc(Uint8Array) --> Uint8Array --> (???) —> ImageAsset
现在卡在是 ??? 这一步。
如果能拿到ImageAsset和plist之后,应该主要是体力劳动了。

目前还有一个思路是整个下载压缩包。但是一样的问题是,压缩包解压缩之后怎么把文件转成ImageAsset。这样整个压缩包加密压缩反而效率更高些,或者Cocos有API能做到压缩包直接解压缩提取ImageAsset的API?

看到了, 十分感谢,我一开始也是用LoadRemote搞得,后来发现加密后的资源文件似乎不太行,于是又换成了load方法。
现在我这边主要还是得看看怎么把响应回来的字符串转换成ImageAsset或者Texture, 然后后面就容易的多了。

已解决, 见: https://forum.cocos.org/t/topic/154963/4?u=jomu_7
感谢各位朋友的帮助。不少回答给了很多和好的思路。
十分感谢!

试了一些方法, 动态解析我没有用pipeline,而是直接用assetManager.loadAny拿到base64之后再解码自己处理图片的转换。
图片转换参看我上面贴的那个答案就行。
最近忙着上线前做资源加密,等上线了比较轻松后把经验梳理一下。学习了不少懂写感谢论坛各位大佬。