分享一下小游戏远程资源更新

远程资源更新不能更新js文件,因为js文件都在小游戏包内
远程资源更新只能更新在远程服务器的资源,在微信小游戏的包内主包与子包的资源都是不能更新的,比如构建时候点了初始场景分包,初始场景包内的资源也就不能更新.

远程资源更新适用场景:
提包了只想修改一下表或者替换一下图片,避免因为一个图片或者表的修改就得重新提包,如果有代码更改还是只能提包更新
远程资源更新这个的副作用
1.因为要自定义引擎,所以分离引擎功能失效了

远程资源更新简介:
小游戏打出来的包会有一个src目录下有一个settings.json文件,这里面包含了所有项目包的所有版本信息
因为我们得对settings文件下的远程包的版本进行更新·所以就不能放在小游戏包内·得放在远程服务器上通过网络请求得到.
当我们打个只更新远程资源的小游戏包的时候,会对上传到服务器的settings文件内的远程包的版本进行更新.

小游戏的远程资源包包内的脚本是放在小游戏包里的·远程资源包包内的资源配置信息是
放在远程服务器的.
3.8.1包内的脚本有版本信息作为后缀,所以得注意下面这个问题
比如我有一个远程包resources包,第一次构建出来的小游戏包内的settings文件resources包的版本是123,将settings文件上传到服务器
编译运行一次构建的工程,小游戏加载包时就会去找src/bundle-scripts/resources/index.123.js文件.第一次正常运行
当我们对resources包内资源进行修改后,重新新建一个构建任务构建工程,注意和第一次构建在不同的目录中,
构建完后去更新远程settings文件中resources包的版本信息,比如更新resources包版本改为了456,
编译运行第一次构建的工程,小游戏加载包时就会去找src/bundle-scripts/resources/index.456.js文件,但是第一次构建包里面没有这个文件,只有index.123.js文件,所以就报错了
所以我们加载包代码用的版本应该是123,包内资源配置版本用456就没问题了.
引擎2.4可以忽略这个·远程包生成的index脚本没有使用版本信息作为文件后缀

引擎3.8.1微信小游戏的使用
1.找到你的引擎目录\cocos\asset\asset-manager\downloader.ts文件找到bundleVers属性再下面添加代码
/**
* @en Version information of all bundles.
* @zh 新的包的版本信息。
*/
public newBundleVers: Record<string, string> = {};
改后的代码JC(NGC@SMX)_95A`UV2X1_S

往下拉找到init函数添加对newBundleVers属性初始化的代码
E@P@6{10871QF5KQ07Q

2.找到你的引擎目录\cocos\asset\asset-manager\asset-manager.ts找到init函数
添加代码 const newBundleVers = options.bundleVers || settings.querySettings(Settings.Category.ASSETS, ‘newBundleVers’) || {};
将this.downloader.init(server, bundleVers, remoteBundles);改为this.downloader.init(server, bundleVers, newBundleVers, remoteBundles);
改后的代码
()KD$6ZWBG}9VP

2.找到你的引擎目录\platforms\minigame\common\engine\AssetManager.ts找到downloadBundle函数,添加修改代码
const configVersion = options.version || cc.assetManager.downloader.newBundleVers[bundleName] || cc.assetManager.downloader.bundleVers[bundleName];
const configSuffix = configVersion ? ${configVersion}. : ‘’;
const config = ${url}/config.${configSuffix}json;
改后代码
U)BYCF41L4F5{9~R6~4X92

3.找到你的引擎目录\cocos\core\settings.ts找到init函数找到图中的代码
C0Z1LTMA4C6$OV2D$C@3C5
改为
let retryCount = 3;
const retryInterval = 2000;
let requestSettings = () => {
let xhr = new XMLHttpRequest();
xhr.setRequestHeader(“Cache-Control”, “max-age=0”);
xhr.open(‘GET’, path);
xhr.responseType = ‘text’;
xhr.onload = () => {
this._settings = JSON.parse(xhr.response);
resolve();
};
xhr.onerror = () => {
if (retryCount-- > 0) {
setTimeout(requestSettings, retryInterval);
} else {
reject(new Error(‘request settings failed!’));
}
};
xhr.send(null);
}
requestSettings();

xhr.setRequestHeader(“Cache-Control”, “max-age=0”)是为了避免使用缓存的settings文件·重新进游戏就能马上生效,不然得等到缓存的生命周期到限
4.开发者菜单-编译引擎
5.在引擎根目录执行

安装 gulp 构建工具

npm install -g gulp

安装依赖的模块

npm install

更新小游戏适配拷贝的engin-adapter代码

npm run bundle-adapter

推荐nodejs v15 版本, 3.8.1是拷贝的是合并平台适配后的代码,是从引擎engine\bin\adapter\minigame\wechat\engine-adapter.js拷贝到小游戏工程的,所以修改适配平台代码以后都得执行这一步,才能生成新的engine-adapter.js

6.小游戏构建完以后得修改打出来的application文件将
this.settingsPath 改为你setting的远程地址,这里我是已经改过了的_BGYMQX4_8NKH`%TEX52C{O

我写了一个构建插件用于辅助打完包后对第6步骤进行修改,以及拷贝remote目录到本地服务器目录,拷贝settings文件或者更新settings文件到本地服务器目录

新建一个构建任务选择微信小游戏,不勾选是否只更新远程资源,填写远程资源发布路径,填写远程配置发布路径,填写远程配置版本,填写远程配置地址,构建后用微信开发工具打开
打完包以后对test场景进行修改,挪动一下canvas下节点的坐标什么的
再新建一个构建任务,修改发布路径,不要和第一次构建的路径一样,避免覆盖了第一次的工程.除了勾选是否只更新远程资源,其他跟第一个构建任务一致,
构建完后用微信开发工具重新编译一下第一次构建的项目就可以看见变化了
第一次构建跟第二次构建应该都是debug模式或者都是release

插件
wechatgame-build.rar (158.7 KB)
测试工程
minigame-remote-assets-update-3.8.rar (12.5 KB)

引擎2.4.12微信小游戏的使用
1.打出的setttings是个js文件不是json,得转为json然后传到远程服务器
2.找到你的引擎目录\resources\builtin\adapters\platforms\wechat\res\game.js
注释//require(’./src/settings’);
注释//window.boot();
添加代码
let retryCount = 3;
const retryInterval = 2000;
const path = “%{settingsUrl}”;
let requestSettings = () => {
let xhr = new XMLHttpRequest();
xhr.setRequestHeader(“Cache-Control”, “max-age=0”);
xhr.open(‘GET’, path);
xhr.responseType = ‘text’;
xhr.onload = () => {
window._CCSettings = JSON.parse(xhr.response);
window.boot();
};
xhr.onerror = () => {
if (retryCount-- > 0) {
setTimeout(requestSettings, retryInterval);
} else {
throw(new Error(‘request settings failed!’));
}
};
xhr.send(null);
}
requestSettings();

改后的代码这样image

也可以自定义构建模版以实现对game.js的修改

我写了一个扩展用于辅助构建后对第1步骤进行修改,对第二步的%{settingsUrl}进行填充,拷贝remote目录到本地服务器目录,拷贝settings文件或者更新settings文件到本地服务器目录
构建时先填写扩展面板的参数

工程和插件都在这里minigame-remote-assets-update-2.4.rar (215.7 KB)

扩展面板中不勾选是否只更新远程资源,填写远程资源发布路径,填写远程配置发布路径,填写远程配置版本,填写远程配置地址,新建一个构建任务选择微信小游戏,构建后用微信开发工具打开
打完包以后对test场景进行修改,挪动一下canvas下节点的坐标什么的
扩展面板除了勾选是否只更新远程资源,其他跟第一次填写的扩展面板参数一致,修改发布路径,不要和第一次构建的路径一样,避免覆盖了第一次的工程.
构建完后用微信开发工具重新编译一下第一次构建的项目就可以看见变化了
第一次构建跟第二次构建应该都是debug模式或者都是release

注意如果不能更新远程settings·构建时候会有错误抛出,注意看一下编辑器的控制台输出,当对非远程包的版本有更改就不能更新远程settings

2赞

不太理解,这种基础的功能,官方为啥不支持。COCOS最大的问题就是,很多基础功能要么收费,要么不支持。

是啊·官方支持的话·我们就不用去定制了,只不过还好·至少开源的嘛·可以自己修改

1赞

因为不合规啊(当然官方可能不是出于这个考虑),小游戏不能热更,不是仅仅指代码,而是所有的资源。当然你说为什么远程的资源没事,因为这种合规,更多的是指审核合规,就是说只要线上和审核时的资源一样,跟资源处于何处无关。所以一般其实没人管,但是像这种资源完全热更,是违规的,假设真的更新的某张图片违规(特别是涉及zz),至少抖音是直接封账号的,但如果是审核时就有,只是后续违规了,抖音只是提示违规,会有整改期限。

大佬言之有里·所以说使用远程资源更新有违规的风险,使用还是得慎重啊。

来了来了,我来试试,感谢大佬

能用不嘛 :joy:

ok,不能用再找大佬,哈哈哈

mark个脚印~

经测试,老哥这个思路没有问题,抖小已经通过真机测试服验证
唯一的问题是你写的帖子格式太难看了。。。
BC26D6AA41F438A76058D5E59A7E198F
我在思考要不要出一个好点的图文 帮你整理一下


以下需要注意:
1.这个方式一定不能勾选md5cache,可以在远程settings.json后面带时间戳解决,同时bundle也不能带md5cache,需要通过用不同文件夹名字(让地址不一样)来解决
2.bundle一定不能带代码更新变动,一个都不要带,单纯的美术音乐预制体(文本类)这类更新就可以了,新增的资源也没问题。
3.要考虑一下各种小游戏缓存文件夹大小的设置情况,做一个清理缓存的逻辑。

大哥·我这个是基于勾选md5缓存的。不勾选md5缓存,你得自己去实现资源更新逻辑,我觉得用引擎提供md5缓存就挺好的啊。这个思路我是已经在自己的项目中应用了的,所以才分享出来嘛

不是,我说的是你这个方法下,勾选了MD5CACHE会有问题

可以请教哪里有问题么 :slightly_smiling_face:,我打的包都是勾选了md5缓存的