- Creator 版本: 3.8
- 目标平台: 微信
请问:
我的游戏有后端, 在服务器放置若干atlas, 随着游戏更新,我希望不需要更新版本就能更新这些atlast,可以直接用web请求远程下载这两个文件,但是我不知道下载之后应该如何解析成SpriteAtlas并动态使用其中的SpriteFrame?
提前感谢!
PS. 哪位大佬有cocos的群可以加一下,刚失业入cocos坑不久, 业务逻辑开发基本完成,虽然发现很难,但是也跑不掉了 
请问:
我的游戏有后端, 在服务器放置若干atlas, 随着游戏更新,我希望不需要更新版本就能更新这些atlast,可以直接用web请求远程下载这两个文件,但是我不知道下载之后应该如何解析成SpriteAtlas并动态使用其中的SpriteFrame?
提前感谢!
PS. 哪位大佬有cocos的群可以加一下,刚失业入cocos坑不久, 业务逻辑开发基本完成,虽然发现很难,但是也跑不掉了 
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
}
}
十分感谢, 我试一下, 这两天我还看了下一个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, 然后后面就容易的多了。
试了一些方法, 动态解析我没有用pipeline,而是直接用assetManager.loadAny拿到base64之后再解码自己处理图片的转换。
图片转换参看我上面贴的那个答案就行。
最近忙着上线前做资源加密,等上线了比较轻松后把经验梳理一下。学习了不少懂写感谢论坛各位大佬。