大厅子游戏实现指引,creator2.0以上

mark

mark

经过一段时间的完善,修复了一些问题,现在补充个demo,其实这篇文章的目的还是提供一个思路供大家参考,下面简单写下需要注意的点:

  1. 包体内资源表project.manifest,要实现更新,首先包内要有一个记录包体资源的表,我讲此表单独放在了包体内(跟res、src目录同级的目录中),而不是当作游戏资源打包。

  2. 我将搜索路径的处理放在了main.js中,固定写死,不需要在更新结束时处理,同时完善了下整包更新覆盖安装时的处理。

  3. 资源分包的处理为 package/main.js 和 pack_generator.js,因没有经过大量的测试,不确定是否完善。这部分如果大家有更好的处理方案,或发现有什么bug,欢迎反馈。

  4. 发包时需要注意,需要删除多余的资源,使包体内仅包含你所需要的基本资源。

  5. 以此demo为例(更新为单包方案,分包可参考,做一些小改动即可)
    TTHotUpdate.js 为更新插件脚本,基本不需要改动(仅需修改emit方法,改为你自己的事件发送逻辑)
    TTUpgrade.js 为具体的更新处理逻辑,demo为单包方案,分包方案需要改动其中的 file_version等字段,逻辑不复杂,稍微看下都能懂

  6. 此demo可在模拟器下做更新测试,不过需要你自己搭建一个站点,存放更新资源,还有一点,模拟器更新完重启后会报错卡死,这个我不清楚为何。

修复了bug,重新上传了单包模式的DEMO: uptest.zip (20.4 KB)

如果需要看大厅子游戏模式的分包DEMO,请看下面 44 楼

3赞

我这边实现的想法是,大厅+子游戏在一个工程开发,但是打包的话,用批处理脚本,将大厅、子游戏的资源单独拷贝到一个专门的打包目录,单独打包。这个方案就是要求目录要按照一定的规则创建好,这样方便批处理脚本去拷贝资源。
原理还是参考之前论坛上实现的方案,用了两个额外的js文件来实现加载大厅、加载子游戏,用途其实就是加载大厅、子游戏对应的资源索引。

mark

这个我之前考虑过,但操作起来比较复杂,对公共代码、资源的处理还是不够完善。
我不知道你是怎么处理资源的,是每个子游戏单独一个资源目录还是整个包只存在一个资源目录。
我是想实现所有的代码、资源都只存在一份,不会重复。

统一工程开发的时候,大厅、子游戏的资源都是在resource目录下,比如resource/plaza, resource/game/land 这样,代码的话 script/plaza,script/game/land。在子游戏中可以使用大厅的资源。
我是参考了论坛中给到的方案,用额外的js(就是改造的main.js),将建立资源索引的setting.js引用进来。在引用大厅的setting.js的时候,用全局变量将里面的数据存储起来;再进子游戏的时候,将大厅的setting数据,和子游戏的setting数据合并,这样就能在子游戏中加载大厅的公共资源了。
我在android和ios上都测试过没有问题,能正常的进入大厅、子游戏,退出子游戏,切换到别的子游戏,更新功能也正常

你好,能提供一下DEMO参考吗?

想法一样,我这边也是一个项目工程,资源按照目录可配置,更新大厅的时候代码和资源索引列表更新,更新子游戏的时候直接更新完子游戏资源就可以用,不用重启。 只是大厅更新需要重启一次

23楼就是demo啊,里面有完整的更新逻辑了,只不是我只写了大厅的更新,子游戏几乎copy一遍TTUpgrade就能用了,更改下module字段为对应子游戏的.

理论上更新完都需要重启吧,例如下面的情况:
打开子游戏 – 返回大厅 – 再打开子游戏发现有更新(资源已存在缓存中,不重启的话可能导致新的无法生效)

子游戏更新完也需要重启吗
感觉这样体验不好呀

我这边使用uptest.zip这个demo发布安卓启动会闪退,还有请问那个assetlist/main.js是怎么使用的?是把jsb-link/main.js替换掉吗?

assetlist是个插件,里面有些API,会在构建阶段调用,主要作用1.处理资源模块,2.修改jsb-link/main.js文件,处理资源搜索路径。
我猜测你的闪退是因为 jsb.fileUtils.getStringFromFile(‘project.manifest’) 导致的(项目中没有资源列表),你需要仔细读下这个实现原理,还有项目中有个readme文件

你好,现在我还存在一些疑惑。如assets/assetlist.tx的内容跟pack_gen.bat中的第一行param参数和13行中的node pack_generator.js -v 1.0.0中的对应关系。
例如现在我在demo中添加子游戏monkey.fire版本1.0.0发布安装,然后修改monkey,在pack_gen.bat中param对应模块version修改为1.1.0后生成monkey_version.manifest 1.1.0,但是更新没反应。只能pack_generator.js -v 1.1.0生成project.manifest 1.1.0进行更新。
是我哪个步骤出问题了?
现在我的目的是在大厅添加子游戏入口然后点击能够下载更新子游戏进入。

  1. assetlist.txt跟其他无对应关系,这个是用来记录资源所属模块的,需要填写场景文件和resources文件夹内的文件,这样构建时就可以根据这个配置生成对应模块的资源列表。(分包的关键部分就是要识别资源所属的子包,这部分内容可以自行处理)
  2. pack_gen里面的param是记录每个模块的版本号的,用来做分包用的。
    一般分包的话,你的包体内只需要包含hall_project.manifest的资源,更新时需要处理file_module字段,填写你要更新的模块。
  3. 第12行的版本号其实是为了兼容单包而做的,这个demo里我的this.file_module = ‘’,没有做分包处理,生成的project.manifest用到了这个版本号。如果你是做分包,可以忽略这个。

大佬求教,我尝试修改了TTUppgrade.js中check_update()里面的this.file_version,this.file_project,this.file_module等参数,更新时也从服务器正确下载到了monkey_project.manifest,但是更新会把整个项目都更新到了,无论是hall还是fish。
我是把uptest/remote-assets-all文件夹的内容放到服务器上的,另外uptest/remote-assets跟uptest/remote-assets-all对应作用分别是什么呢?是我放错了吗?




可以不用的,子游戏的资源是独立的,清下cc.loader 的cache

兄弟 分享个demo 给大伙学习下哦

抱歉这么晚回复,周末没在家,也就没看论坛

  1. file_manifest部分你要处理下,更新就是拿 file_manifest跟远程的xx_project.manifest对比,分析差异的资源然后更新。
    我demo里是整包,所以这个文件project.manifest放在了包体内。
    如果是子包,是不需要放置在包体内,需要你自己判断更新目录下是否存在相应的xx_project.manifest文件,不存在则认为本地还没有下载这个子包。

  2. remote-assets-all是整个项目的所有资源
    remote-assets中是某个子包的资源(pack_gen中param中include字段为true的资源)