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

经测试,运行pack_gen.bat后生成的subgame1_project.manifest内容包含subgame2和hall的资源文件,所以更新subgame1也会把subgame2和hall更新了。
后来我把pack_gen中subgame2中include字段设置为true,导出的remote-assets资源放在AS中跑也是会包含hall。
项目中hall可以loadscene启动subgame1,而subgame2跟subgame1,hall一点联系都没有。
能麻烦楼主放个子包DEMO吗,这几天搞到头到爆炸了…

有个问题要指出下包体中 main.js中的关键字 let 在ios9设备中会不支持 ,会报语法错误,需要替换为var(请在package/assetlist/main.js中newStr中将let替换为var,重新构建)。

  1. 这个方案的原理就是将所有大厅子游戏当成是一个项目,实现所有资源、代码共用,subgame1中包含subgame2的资源是正常的事(如果2个游戏都用到相同的资源)。
  2. 每个subgame都包含hall的资源,这是我个人的设计,因为这样基本不需要单独去更新大厅了(在更新子游戏的时候就会更新大厅)。
    如果觉得不喜欢,可以去掉这个设计,更改一行代码就可以。pack_generator208行,去掉includes(‘hall’)
  3. jsb-link下有2个文件asset_module.json 和 asset_pack.json 是用来辅助查看资源模块的,你可以这个是否正确,如果没问题,那么生成的xx_project.manifest就应该是ok的

上一份demo漏掉了几行代码,造成了bug,在此更正下 TTUpgrade.js文件的45行
我会重新上传demo,在20190701前的需要自己更正下

    if(!jsb.fileUtils.isFileExist(temp))
        this.file_manifest = jsb.fileUtils.getStringFromFile('project.manifest')
    else
        this.file_manifest = jsb.fileUtils.getStringFromFile(temp)

因为漏掉了读取file_manifest文件,会导致每次更新都会重新更新一遍整个资源


上传了一个大厅子游戏模式的demo,修改了一些东西

  1. 修复打包插件在ios9设备下let语法报错导致的黑屏(main.js中let会在ios9设备下报语法错误)
  2. 默认关闭了每个子游戏包含hall资源的做法
  3. 更改资源目录 remote-assets包含所有资源,remote-assets-sub仅包含子模块资源

大厅子游戏模式DEMO:uptest_sub.zip (99.1 KB)

如果使用大厅子游戏模式,需要说明的是:
1.发包的时候,一定要删掉多余资源,仅保留大厅资源。可以用remote-assets-sub中res文件夹替换掉jsb-link下的res文件夹
2. 一定要保证包体内包含一份资源列表文件,即hall_project.manifest
@363082275

1赞

感谢多次指导回复,经过排错,之前出错的原因在于assetlist.txt中path参数填写错误,真的是犯了一个低级错误…

可以详细描述一下打包流程,更新流程吗?谢谢

:joy:这个该怎么说呢?这里面并没有涉及到什么复杂的流程。
打包没什么可讲的,就正常的构建、编译,只是有一点,要将生成的project.manifest加入到包体内(放到跟main.js同级目录)
更新也是用的官方提供的方案实现,建议先自己动手跑跑这个demo,看下官方热更文档,理解透更新的实现原理。

既然这样,我描述一下我的执行流程,请你确认一下是否正确
首先安装扩展插件 assetlist
1 打包流程:
1.1 构建项目,更改pack_gen.bat脚本参数,
set param=[^
{ ““name””: ““hall””, ““version””: "“1.0.0"”, ““include””: true },^
{ ““name””: ““mj””, ““version””: "“1.0.1"”, ““include””: false },^
{ ““name””: ““pdk””, ““version””: "“1.0.1"”, ““include””: false}^
]
更改更新路径,和代码中的一致
1.2 执行脚本,生成子包hall的资源
1.3 删除build\jsb-link目录下的*_project.manifest,*_version.manifest, 删除res src目录
1.4 拷贝remote-assets-sub 目录下的内容到build\jsb-link
1.5 \build\jsb-link\frameworks\runtime-src\proj.android-studio\app目录下build.gradle文件,
在android.applicationVariants.all部分添加
copy {
from “{sourceDir}/hall_project.manifest" from "{sourceDir}/hall_version.manifest”
into outputDir
}
1.6 编译项目打包apk

2 更新hall流程:
2.1 更改项目内容,构建项目,更改pack_gen.bat脚本参数,
set param=[^
{ ““name””: ““hall””, ““version””: "“1.0.1"”, ““include””: true },^
{ ““name””: ““mj””, ““version””: "“1.0.1"”, ““include””: false },^
{ ““name””: ““pdk””, ““version””: "“1.0.1"”, ““include””: false}^
]
更改更新路径,和代码中的一致
2.2 执行脚本,生成子包hall的资源
2.3 拷贝remote-assets-sub目录下的资源到更新服务器
2.4 启动更新服务
2.5 安装apk,点击 updatehall 按钮

3 下载更新子游戏流程(以mj为例)
3.1 构建项目,更改pack_gen.bat脚本参数,
set param=[^
{ ““name””: ““hall””, ““version””: "“1.0.1"”, ““include””: false},^
{ ““name””: ““mj””, ““version””: "“1.0.1"”, ““include””: true},^
{ ““name””: ““pdk””, ““version””: "“1.0.1"”, ““include””: false}^
]
更改更新路径,和代码中的一致
3.2 执行脚本,生成子包mj的资源
3.3 拷贝remote-assets-sub目录下的资源到更新服务器
3.4 点击 update mj 按钮

请指教,谢谢!

整个流程是ok的,有2点参考下:

  1. hall_version.manifest文件可以不需要,更新只是拿hall_project对比。
  2. 关于更新路径部分,我不太明白你的描述。整个项目的更新路径是固定的,不需要更改的,所以其实你可以每次都上传remote-assets里面的资源或是上传remote-assets-sub里的资源到固定目录的服务器上。

更新时候报错
jsb.EventAssetsManager.ERROR_UPDATING
错误信息:7 Couldn’t resolve host name

ERROR_UPDATING res/import/f0/f0048c10-f03e-4c97-b9d3-3506e1d58952.json, Couldn’t resolve host name

核对服务器地址无误,浏览器均可正常访问

无法解析主机,这个应该是你自己的网络环境问题,需要你自己去排查,看看是不是跟权限相关

话说,,这套更新主要是对资源进行更新吧,如果子游戏修改了prefab文件,最后打包的时候会生成到js里面的,而js文件是直接打包成一个的,那如果修改了一个prefab文件的话,是需要整个js文件都更新吧。

。。。

  1. 这个更新方案是完全使用的官方更新方案。
  2. 更改prefab并不一定会改变js文件,资源的记录文件是setting.js,对资源的更改 有可能 会改变这个文件。
    而所有脚本的合并文件是project.js。所以一般更改资源是不会导致脚本文件更改的。
  3. 这个方案有一点需要注意下:
    任何资源或脚本的更改都有可能影响到其他的子游戏模块,因为本方案没有做运行环境的隔离,所有内容都是属于同一个项目的。

大佬.你目录内的AssetList 是否是记录 子游戏资源的列表呢?

是的,可以这么理解。
module就是子游戏名称

请问 assetlist这个插件怎么使用?

插件在项目的packages目录下会自动加载的,在构建的时候就会触发脚本里面的相关方法。
具体的API查看文档

第一次进入游戏,大厅和公共资源都在登录之前更新,进入大厅后,下载子游戏。
第二次进入游戏,更新大厅,公共资源,下载过的子游戏。
这样子是不是就能做到更新子游戏不用重启了?因为只有第一次进入的时候才下载,之后的更新都在进入大厅之前进行。

这样恐怕是不行的,因为app的资源列表是在main.js中初始化的(cc.AssetLibrary.init),所以如果想要达到不重启需要2个条件:

  1. 重新初始化资源列表。(还需要释放已经缓存的资源)
  2. 重启js虚拟机,保证拿到最新的代码。(事实上在引用的脚本还是无法保证为最新的,官方文档中也有介绍)