CocosCreator以Asset Bundle实现大厅+子游
前言
在写这篇文章前,之前有写过一篇以CocosCreator以subpackages分包实现大厅+子游戏,但以这种方式存在一个问题,就是没有做到实际意义上的大厅+子游戏,官方的说明如下:
配置为子包后,只有原生资源,例如图片和音频会被最终放到子包中。Prefab、AnimationClip 等 JSON 类型的资源仍然会放在主包里
这就意味着子包如果在只改变了Prefab、AnimationClip等JSON类型资源时,按我们的理解是改变了子游戏,更新子游戏子包,但其实这个时候,是更新大厅,这类生成的资源都包含在主包内,而并没有包含在子包里。
从v2.4,Creator 正式支持 Asset Bundle 功能。Asset Bundle 作为资源模块化工具,允许开发者按照项目需求将贴图、脚本、场景等资源划分在多个 Asset Bundle 中,然后在游戏运行过程中,按照需求去加载不同的 Asset Bundle,以减少启动时需要加载的资源数量,从而减少首次下载和加载游戏时所需的时间。
Asset Bundle 可以按需求随意放置,比如可以放在远程服务器、本地、或者小游戏平台的分包中。也可以跨项目复用,用于加载子项目中的 Asset Bundle。
这个方式,彻底的解决了之前版本的短板,真正意义上的实现了资源及代码的分包。
项目环境
CocosCreator 2.4.0
Microsoft Visual Studio Enterprise 2015(SDK安装 : Windows Phone SDK 8.0)
Microsoft Visual Code
Android Studio 3.6.3(API Level : android-28 NDK : https://dl.google.com/android/repository/android-ndk-r18b-windows-x86_64.zip)
项目示例
示例Git地址https://github.com/TopDiscover/QuickFramework/tree/2.4.0
项目关键点
1、该方案基于Asset Bundle
2、大厅与子游戏代码作为同一项目开发,方便对资源及代码的管理,可有效的解决多项目开发可能产生uuid重复问题
3、子游戏之间代码及资源不能相互引用
4、大厅与子游戏之间的通信全部以事件方式进行交互
项目结构
大厅与子游戏分别单独的作为一个整体,结构如下:

红色区域
resources目录为大厅的资源(大厅+公共)
script目录为大厅的代码(大厅+公共+框架)
黄色区域的子游戏,分别配置Bundle,如下:


项目扩展插件使用

1、引擎修正
为了后面使用方便,安装好你的Creator2.4.0,直接使用引擎修正后,再构建项目,对引擎修改的部分会自动生成到你的构造项目中,如果你的项目目前已经构建,对引擎改动的代码放置在package/engine目录
下,到该目录下用对比工具同步到你的项目中,目前还未支持对已经生成构建的项目进行引擎代码的修正
2、资源引用检测
在游戏开发过程中,由于某些子游戏相当类似,所有直接复制进行修改,此时复制得到的子游戏的资源引用仍然指向以前的地方,并未指向复制后得到的资源,又或者不小心在A游戏使用了B游戏的资源,此时在打包完成后,且子游戏都不放置到包内,当通过热更新子游戏进入时,由于只下载了B游戏的资源,但B游戏的资源大多都还指向A游戏,此时会造成找不到资源可能产生崩溃的现象。但当我们游戏的预置体在足够多的情况,如果手动的排查,是一个非常大的工程,所以这边提供了一个检测工具,去检测你的子游戏预置体是否使用到了其它子游戏的资源,如下图

当你的子游戏做完后,可使用插件来检测完成的子游戏是否引用了其它子游戏的资源,控制台的警告就是你引用了不属于自己子游戏的资源,需要自己手动去处理掉这些问题
3、热更新工具

工具说明
大厅生成Manifest配置
版本号:当前大厅的版本号
资源服务器地址:cdn资源服务器地址
build项目资源文件目录:指定你的build目录,如

点击生成会生成版本控制文件如下图


子游戏生成Manifest配置
目录只能配置子游戏的游戏版本号
测试环境一栏
主要关注本地server物理路径,可以指定你的服务器路径,热更新相关文件直接部署到你的服务器
如我本地服务器:

点击部署,最终服务器部署的资源如下:

执行子游戏包剔除:
当你部署完成后,如果不希望把某个子游戏放入到原始包内,可执行这个命令剔除不包含在包内的子游戏
4、扩展插件配置说明
热更新子游戏及大厅版本的配置及资源检测插件中显示的游戏在packages/config/games.json配置,当开发完成子游戏时,如果需要对其实资源引用合法性检测及版本做更新时,直接对games.json进行修改
示例测试
1、构建版本

2、生成热更新版本控制文件
使用热更新插件生成热更新版本控制文件,并部署到自己的测试服务器,如下

3,剔除子游戏
如果希望子游戏在包内,可在【是否包含在原始包内】打勾,否则相反
这里测试一个在包内一个不再包内的情况,配置如下

4、win32平台编译运行
打开build\jsb-default\frameworks\runtime-src\proj.win32的工程编译打开游戏如下

左边为该游戏的工作目录,目前主包并没有包含有子游戏的代码及资源
分别进入两个子游戏之后,本地缓存如下,gameTwo不在包含,下载子游戏 后运行,gameOne在包内,由于跟服务器版本一致,不会下载,直接使用本地资源及代码
运行游戏1,未产生资源代码的下载,直接使用本地资源代码

运行游戏2,下载了服务器最新资源及代码如下
