经测试,运行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,重新构建)。
- 这个方案的原理就是将所有大厅子游戏当成是一个项目,实现所有资源、代码共用,subgame1中包含subgame2的资源是正常的事(如果2个游戏都用到相同的资源)。
- 每个subgame都包含hall的资源,这是我个人的设计,因为这样基本不需要单独去更新大厅了(在更新子游戏的时候就会更新大厅)。
如果觉得不喜欢,可以去掉这个设计,更改一行代码就可以。pack_generator208行,去掉includes(‘hall’) - 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,修改了一些东西
- 修复打包插件在ios9设备下let语法报错导致的黑屏(main.js中let会在ios9设备下报语法错误)
- 默认关闭了每个子游戏包含hall资源的做法
- 更改资源目录 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
感谢多次指导回复,经过排错,之前出错的原因在于assetlist.txt中path参数填写错误,真的是犯了一个低级错误…
可以详细描述一下打包流程,更新流程吗?谢谢
这个该怎么说呢?这里面并没有涉及到什么复杂的流程。
打包没什么可讲的,就正常的构建、编译,只是有一点,要将生成的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点参考下:
- hall_version.manifest文件可以不需要,更新只是拿hall_project对比。
- 关于更新路径部分,我不太明白你的描述。整个项目的更新路径是固定的,不需要更改的,所以其实你可以每次都上传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文件都更新吧。
。。。
- 这个更新方案是完全使用的官方更新方案。
-
更改prefab并不一定会改变js文件,资源的记录文件是setting.js,对资源的更改 有可能 会改变这个文件。
而所有脚本的合并文件是project.js。所以一般更改资源是不会导致脚本文件更改的。 - 这个方案有一点需要注意下:
任何资源或脚本的更改都有可能影响到其他的子游戏模块,因为本方案没有做运行环境的隔离,所有内容都是属于同一个项目的。
大佬.你目录内的AssetList 是否是记录 子游戏资源的列表呢?
是的,可以这么理解。
module就是子游戏名称
请问 assetlist这个插件怎么使用?
插件在项目的packages目录下会自动加载的,在构建的时候就会触发脚本里面的相关方法。
具体的API查看文档
第一次进入游戏,大厅和公共资源都在登录之前更新,进入大厅后,下载子游戏。
第二次进入游戏,更新大厅,公共资源,下载过的子游戏。
这样子是不是就能做到更新子游戏不用重启了?因为只有第一次进入的时候才下载,之后的更新都在进入大厅之前进行。
这样恐怕是不行的,因为app的资源列表是在main.js中初始化的(cc.AssetLibrary.init),所以如果想要达到不重启需要2个条件:
- 重新初始化资源列表。(还需要释放已经缓存的资源)
- 重启js虚拟机,保证拿到最新的代码。(事实上在引用的脚本还是无法保证为最新的,官方文档中也有介绍)