一般bundle热更之后只能通过cc.game.restart重启游戏去刷新资源,并不能直接热加载脚本,那么问题就来了,本来bundle就是一个子游戏,为啥非要刷新整个游戏呢,这就有点蛋疼了,这次就是可以不用重启游戏的方法。
直接去找打包之后对应发布平台的的路径,在里面找到cocos2d-jsb.js这个文件
…/发布平台/src/cocos2d-jsb.js 发布平台 = jsb-link或者web-mobile或者web-desktop等等…
第一步
如图中所示,直接添加
js.delClassById = function(classId) {
delete _idToClass[classId];
};
js.delClassByName = function(classname) {
delete _nameToClass[classname];
};
第二步
在cc._RF的push函数当中添加一段代码
if(window.isLoadingBundle){
cc.js.delClassById(uuid);
cc.js.delClassByName(script);
}
此时就已经完成了,当热更完毕之后,重新加载bundle的时候先把 window.isLoadingBundle = true; 加载完之后再置为false。
window.isLoadingBundle = true;
cc.assetManager.loadBundle('TEST', (err, bundle) => {
window.isLoadingBundle = false;
});
原理很简单,本质上就是当从加载bundle之后,会加载bundle里面的脚本,这个时候会走jsb-engine.js中的downloadScript这个函数。加载完之后会被require
此时require之后的js脚本有个立即执行函数,且恰巧cc.RF.push会传入我们需要的参数,这个问题就完美的解决了