请问热更新后还是要重新启动吗?

因为这个问题在16年有问过了,最近自己测试的结果是不行。
以下是我的方式。

main.js 中
// 预先将热更新后的场景加入
var obj = {
“url” : “db://assets/GameA/GameA.fire”,
“uuid” : “51ecb7d5-b04a-446c-82f7-3a65398c93cc”
};
_InitObj.scenes.push(obj);
option.scenes = _InitObj.scenes;
cc.game.run(option, onStart);

hotupdate.js 中
// 当下载远端游戏资源包后,在require此游戏所需要的脚本。
path = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : ‘/hotupdateFunc/’) + this.gameName + “/src/project_GameA.js”);
require(path);

之后loadScene出现的错误是:
/Users/rebornchen/Documents/CreatorProjects/HotUpdate_FUNC/build_v1_0/jsb-binary/src/jsb_polyfill.js line:9 msg:TypeError: i[1].split is not a function

请问
(1)有人可以提供查看jsb_polyfill.js的方法吗?
(2)能够不启动游戏进入新加入的场景吗?
如果一定要重启游戏那么要如何保存宣告的变数呢? (例如:websocket连线)

在你的 build 目录中就有

当你需要更新脚本的时候,不可以,如果不重启,更新前创建的对象是使用旧的环境,更新后创建的对象使用新的环境,不太可能跑起来的,而且会造成内存的无谓增长,从各个角度说都很难优雅的直接使用新脚本。

当你只更新纯资源的时候,仍然需要 hack,因为不重启的话,不会重新读取 _Settings.js,其中包含所有场景列表,那么不重启的话就不会包含你新加载的场景,这点在 cc.game 中可以 hack 成功。

我不理解你说的“宣告的变数”什么意思

我看到的是jsb_polyfill.jsc,请问要怎么样才可以查看呢?

例如,在main.js时建立的websocket连线,要如何保存呢?

自动更新完成前完全可以不连接websocket,你这个设计有问题。

你选择调试模式 build 就可以看到了

重新运行 main.js 会重新建立 websocket 链接,我不知道你说的保存是什么意思

请问这里的hack是什么意思?

你可以看一下 build 出来的 main.js 对 CCSettings 的内容作了哪些解析操作,就知道需要哪些 hack 了,比如获取 scenes, rawAssets, packedAssets 等等,理论上是可以 hack 的,但是仍然不建议费这么大功夫,万一引擎的某些内部变量改了,重构了,可能就没用了