从设计层面上, 可以让玩家选择勾选检测到更新后,自动更新. 等待下次用户重启游戏时就已经是最新版本了.
自动更新逻辑,只是将新版bundle提前下载下来, 并不应用到运行中. 这一步是可以做到的.
查看assetManager的实现,发现重复调用assetManager.init()是可行的.
init (options) {
options = options || Object.create(null);
this._files.clear();
this._parsed.clear();
this._releaseManager.init();
this.assets.clear();
this.bundles.clear();
this.packManager.init();
this.downloader.init(options.bundleVers, options.server);
this.parser.init();
this.dependUtil.init();
this.generalImportBase = options.importBase;
this.generalNativeBase = options.nativeBase;
},
此时,如果我们在检测到更新后, 再次调用assetManager.init()将更新信息传入进去, 那 后续再通过assetManager 获取的bundle 等资源都应该是新版本的.
也就是说,当我们检测到有新包时, 调用init(), 然后进入更新界面, 并清除其他界面和业务逻辑, 开始根据更新信息, 依次下次远程bundle. 下载完成后,游戏回到主界面. 以一个全新的游戏进行操作 是可行的.