热更新的使用:官方教程:
官网热更新教程
第一步:先生成配置文件:project.manifest和version.manifest,这两个文件的作用,官网有说明
第二步:创建loading脚本,继承BaseLoading,在属性面板,设置热更新的配置文件和热更新的弹窗
热更新属性面板配置

第三步:loading脚本中实现_fCheckUpdate方法,最后手动调用_fCheck函数,引擎自己会去对比远程和本地的版本文件
第四步:调用startHotUpate函数实现热更新,热更新结束后,游戏会重启,这样获取的就是服务器上最新的资源和脚本
updateCb这个函数中,如果版本是最新的,会进入jsb.EventAssetsManager.ALREADY_UP_TO_DATE:分支,直接读取游戏配置文件进入游戏
this._loadResCfgJson()updateCb这个函数的jsb.EventAssetsManager.UPDATE_PROGRESSION:分支,可以监听到当前下载更新的进度更新的下载进度的监听

event.getDownloadedBytes()当前下载文件的进度
event.getTotalBytes()下载文件的总大小

具体原理可以查看官方教程文档:热更新原理
这里解释下:这个指令
node version_generator.js -v 1.0.0 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s native/package/ -d assets/
官方的解释是这样的:
-v 指定 Manifest 文件的主版本号。
-u 指定服务器远程包的地址,这个地址需要和最初发布版本中 Manifest 文件的远程包地址一致,否则无法检测到更新。
-s 本地原生打包版本的目录相对路径。
-d 保存 Manifest 文件的地址。
经过几代的变迁,现在一般的路径是:
-s 本地原生打包的版本:默认的构建版本路径:/build/jsb-link下
-d 就是你构建完成后,执行上面那条指令后生成最新的热更新配置文件,生成后的存放位置
所以现在一般是:
node version_generator.js -v 1.10.091 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s build/jsb-link -d build/jsb-link/
version_generator.js 下载地址:version_generator.js
将生成出来的总的几个传到服务器即可

最后附上代码:

/*** 开始检查更新--前往检测版本差异*/_fCheck () {// Hot update is only available in Native buildif (! this._isNative()) {return;}this._storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + 'blackjack-remote-asset');console.log('Storage path for remote asset : ' + this._storagePath);// Setup your own version compare handler, versionA and B is versions in string// if the return value greater than 0, versionA is greater than B,// if the return value equals 0, versionA equals to B,// if the return value smaller than 0, versionA is smaller than B.this._versionCompareHandle = function (versionA, versionB) {console.log("JS Custom Version Compare: version A is " + versionA + ', version B is ' + versionB);var vA = versionA.split('.');var vB = versionB.split('.');for (var i = 0; i < vA.length; ++i) {var a = parseInt(vA[i]);var b = parseInt(vB[i] || 0);if (a === b) {continue;}else {return a - b;}}if (vB.length > vA.length) {return -1;}else {return 0;}};// Init with empty manifest url for testing custom manifestthis._am = new jsb.AssetsManager('', this._storagePath, this._versionCompareHandle);if (! cc.sys.ENABLE_GC_FOR_NATIVE_OBJECTS) {this._am.retain();}this._am.setVerifyCallback(function (path, asset) {var compressed = asset.compressed;var expectedMD5 = asset.md5;var relativePath = asset.path;var size = asset.size;if (compressed) {return true;}else {return true;}});if (cc.sys.os === cc.sys.OS_ANDROID) {this._am.setMaxConcurrentTask(2);}this.checkUpdate();},updateCb (event) {var needRestart = false;var failed = false;Com.info('updateCb Code : ' + event.getEventCode())switch (event.getEventCode()){case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:console.log("No local manifest file found, hot update skipped.");failed = true;break;case jsb.EventAssetsManager.UPDATE_PROGRESSION:var msg = event.getMessage();if (msg) {console.log('Updated file: ' + msg);}// this._node_HotUpdate.setProgressLength(event.getDownloadedBytes(), event.getTotalBytes());if (this['_hotUpdateProgress']) {this['_hotUpdateProgress'](event.getDownloadedBytes(), event.getTotalBytes())}break;case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:console.log("Fail to download manifest file, hot update skipped.");failed = true;break;case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:failed = true;Com.info('开始进入游戏1')console.log("Already up to date with the latest remote version.");//this._loadResCfgJson()break;case jsb.EventAssetsManager.UPDATE_FINISHED:needRestart = true;console.log('Update finished. ' + event.getMessage());break;case jsb.EventAssetsManager.UPDATE_FAILED:console.log('Update failed. ' + event.getMessage());break;case jsb.EventAssetsManager.ERROR_UPDATING:console.log('Asset update error: ' + event.getAssetId() + ', ' + event.getMessage());break;case jsb.EventAssetsManager.ERROR_DECOMPRESS:console.log(event.getMessage());break;default:break;}if (failed) {cc.eventManager.removeListener(this._updateListener);this._updateListener = null;this._updating = false;}if (needRestart) {cc.eventManager.removeListener(this._updateListener);this._updateListener = null;var searchPaths = jsb.fileUtils.getSearchPaths();var newPaths = this._am.getLocalManifest().getSearchPaths();console.log(JSON.stringify(newPaths));Array.prototype.unshift(searchPaths, newPaths); cc.sys.localStorage.setItem('HotUpdateSearchPaths', JSON.stringify(searchPaths));jsb.fileUtils.setSearchPaths(searchPaths);cc.audioEngine.stopAll();cc.game.restart();}},//检查更新checkUpdate: function () {if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {this._am.loadLocalManifest(this.manifestUrl)// Resolve md5 url/**********官方文档中的nativeUrl字段,在配置文件中是不存在的,导致会找不到本地的对比文件,坑******************* */// var url = this.manifestUrl.nativeUrl;// if (cc.loader.md5Pipe) {//     url = cc.loader.md5Pipe.transformURL(url);// }// this._am.loadLocalManifest(url);/**********官方文档中的nativeUrl字段,在配置文件中是不存在的,导致会找不到本地的对比文件,坑******************* */}if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) {// this.panel.info.string = 'Failed to load local manifest ...';return;}/***********这个函数已经弃用,坑**************/// this._am.setEventCallback(this.checkCb.bind(this));/***********这个函数已经弃用,坑**************///函数改成这个this._checkListener = new jsb.EventListenerAssetsManager(this._am, this.checkCb.bind(this));cc.eventManager.addListener(this._checkListener, 1);this._am.checkUpdate();this._updating = true;},/*** 开始热更新--这里开始热更新*/startHotUpate: function () {if (this._am && !this._updating) {// this._am.setEventCallback(this.updateCb.bind(this));// if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {//     // Resolve md5 url//     var url = this.manifestUrl.nativeUrl;//     if (cc.loader.md5Pipe) {//         url = cc.loader.md5Pipe.transformURL(url);//     }//     this._am.loadLocalManifest(url);// }this._updateListener = new jsb.EventListenerAssetsManager(this._am, this.updateCb.bind(this))cc.eventManager.addListener(this._updateListener, 1)if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {this._am.loadLocalManifest(this.manifestUrl)}this._failCount = 0;this._am.update();this._updating = true;}},checkCb (event) {console.log('checkCb Code: ' + event.getEventCode());switch (event.getEventCode()){case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:console.log("No local manifest file found, hot update skipped.");break;case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:console.log("Fail to download manifest file, hot update skipped.");//备注处理break;case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:Com.info('开始进入游戏2')console.log("Already up to date with the latest remote version.");//this._loadResCfgJson()break;case jsb.EventAssetsManager.NEW_VERSION_FOUND://this.showUpdateTip();//这里显示更新的提示框break;default:return;}cc.eventManager.removeListener(this._checkListener);this._checkListener = null;this._updating = false;},retry () {if (!this._updating && this._canRetry) {this._canRetry = false;console.log("Retry failed Assets...");this._am.downloadFailedAssets();}},onDestroy: function () {if (this._updateListener) {this._am.setEventCallback(null);this._updateListener = null;}}

更多教程,it菜鸟

cocos creator 热更新相关推荐

  1. Cocos Creator 热更新文件MD5计算和需要注意的问题

    Creator的热更新使用jsb.热更新基本按照 http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html?h=% ...

  2. cocos creator 热更新报错 ERROR_DOWNLOAD_MANIFEST: not permitted by network security policy

    热更新报错信息:'Fail to download manifest file, hot update skipped.'  not permitted by network security pol ...

  3. Cocos Creater 热更新

    转载自:https://www.jianshu.com/p/a033059f376d 惯例先上官方文档: http://docs.cocos.com/creator/manual/zh/advance ...

  4. Cocos Creator 解决热更新资源md5比较引发卡顿问题

    大家在使用Cococ Creator提供的热更新 assetsManagers ,做md5校验的时候,一定会遇到卡顿的问题. 备注:文末有完整实现源码 原因是 Cococ Creator 官方提供的热 ...

  5. Cocos Creator子游戏动态下载实现(大厅+子游戏模式)

    热更新 在App开发过程中,当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖 ...

  6. Cocos Creator基于热更新的分包方案

    cocos 的热更新是基于对比本来文件列表和远程文件列表的md5实现的,如果有多个远程资源库,就可以拿来作为分包方案.大概流程是这样的: 一 确定分包策略 首先是,策划要根据一定的策略,将动态加载的资 ...

  7. Cocos Creator—定制H5游戏首页loading界面

    Cocos Creator从1.0版本发布到现在也有一年多了,按理说一些常见的问题网上都有解决方案,例如"如何自定义首页加载进度条界面"这种普遍需求,应该所有人都会遇到的,因此也有 ...

  8. Cocos Creator 3.x 热更新

    前言:游戏做热更新 是基本需求: 好在 cocos-creator 已经为我们做好了方案,相对于 U3D 的热更新方案来说,使用起来很简便!,不用关注很多细节 本文使用的是 cocos-creator ...

  9. cocos creator 大厅 ➕ 子游戏(子游戏作为单独的项目更新)

    先标记上文章的出处,嘿休嘿,感谢这位:https://www.jianshu.com/p/fe54ca980384 cocos creator版本: 1.9.1 首先建立大厅的项目 添加文件  Sub ...

最新文章

  1. MySQL5.1升级到5.5注意事项
  2. Codeforces 671E Organizing a Race (贪心、线段树)
  3. Java基本数据类型及所占字节大小
  4. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】
  5. KONG网关 — 插件开发
  6. iOS 原生导航栏 修改导航栏文字颜色 大小
  7. 打印机服务器没有响应是怎么回事啊,打印机后台程序没有运行?(打印机后台服务无法启动怎么办?)...
  8. C语言基础知识快速入门(全面)
  9. A-priori算法的简单实现
  10. 3D变形:平移、旋转、缩放
  11. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
  12. java SE 7规范(又名JDK 7)
  13. MATLAB模拟陀螺仪的运动轨迹(附完整代码)
  14. PTA基础编程题目集1-6题答案
  15. 15.PG分区表-内置分区表
  16. 关于蓝桥杯比赛的参赛心得
  17. STM32 Simulink 自动代码生成电机控制:基于反电动势观测器的锁相环设计
  18. C语言之strcmp函数和strncmp函数
  19. ACM 130. [USACO Mar08] 游荡的奶牛(dp+BFS)
  20. 专题05-python操作微信(wxpy)

热门文章

  1. selenium模拟键盘事件(回车、删除、刷新等)
  2. connect to db by mysqldb-python and use it
  3. [附源码]Python计算机毕业设计SSM基于HTML5的智能仓储管理系统(程序+LW)
  4. siri为什么比谷歌搜索“笨”?
  5. 用python将爬取内容写入csv文件中用excel打开后的乱码问题
  6. 提词器是用来干嘛的?好用的提词器软件分享
  7. 月考核答辩作品——基于STC89C52的智能浇花系统
  8. 【Android开发学习24】界面布局之表格布局TableLayout+TableRow
  9. Wetool免费版+配套vx+修复器/开卡机(底部附资源链接)
  10. 移动端和PC端响应式布局