最近准备学一下GameFramework这个开源框架,作者代码更新很快,就是文档一直跟不上,所以边看边总结一些,梳理代码,也和自己之前写过的一些模块做个对比,先从资源管理开始。
框架主页http://gameframework.cn/
编辑资源-ResourceEditor,查看asset和bundle
ResourceEditor.xml文件
- 路径Assets/GameMain/Configs/ResourceEditor.xml。
- 作用:设置路径,以及要打包的资源类型。
Editor界面
- 查看并编辑asset和bundle。
- ResourceList:对应bundle。ResourceContent:对应bundle内的assets。AssetList:对应文件夹结构。
用法
- 从AssetList选择需要打bundle的资源,直接移动到指定bundle,或是以文件夹创建bundle。
- 选项:可选加载方式,是否是packed,packed随app一起。
- Hide Assigned标签,选择是否只显示不在bundle中的资源。
- clean按钮从所有ab中清理无效的资源,并移除所有空的bundle。
- bundle分包以文件夹为基础,特殊的自定义名字和内容。
- 保存时,同时保存ResourceEditor.xml和ResourceCollection.xml。
这个编辑器的优点,可以自定义特殊包的内容,也方便查看。更重要的是可以把分包策略交给资源策划去做,以及区分首包和资源包。
打完整包-ResourceBuilder
ResourceBuilderController类实现具体的打包逻辑。
对资源的封装,分asset和resource
- Asset
- 分为Asset和Scene两个类型。
- 两个属性,guid和所属的resource。
- Resource
- 应该是对应AssetBundle。
- 保存asset的list。
- 相同FileSystem名字打包成一个文件,用于vfs系统。
- ResourceGroup暂时没发现用法,可能资源加载部分会用,到时候再看。
- 资源加载类型,主要分文件、二进制和内存三种,加上压缩方式的组合。二进制加载的资源,内部asset不能超过1个,在设置的时候会判断。二进制和内存加载的资源,需要打包bundle后在处理一下。
资源依赖关系处理--ResourceAnalyzerController.Analyze
- 排除脚本,scene,自身(因为本身也在list里)。
- 每个asset的依赖关系,保存在m_DependencyDatas字典里。
- CircularDependencyChecker检测环形依赖。
- 依赖关系和环形依赖在Resource Analyzer界面查看。
打包--BuildResource函数
- 先调用unity接口打包所有不是二进制加载的资源,要打包的资源保存在assetBundleBuildDataList。
- 然后创建FileSystem,用于将资源打入vfs系统。
- 处理assetBundleResourceDatas:对每个资源执行ProcessAssetBundle函数。
- Crc32算法计算文件的hash值。int hashCode = Utility.Verifier.GetCrc32(bytes);
- 根据文件加载类型,进一步处理字节流。bytes = Utility.Encryption.GetQuickXorBytes(bytes, hashBytes);
- ProcessOutput:对于package和packed文件夹,调用FileSystem将字节流写入指定文件。对于full文件夹,判断是否压缩,单个bundle写入文件。
- 处理binaryResourceDatas:对每个资源执行ProcessBinary函数。
- 逻辑和ProcessAssetBundle几乎是相同的,除了bytes的转换,和路径的获取方式。
- 判断OutputPackageSelected为true,调用ProcessPackageVersionList函数,记录当前版本的asset,resource,fileSystem,创建PackageVersionList实例并序列化,用于运行时查找资源映射,单机版本用,在手游开发中,可以作为测试用。
- 判断OutputFullSelected为true,调用ProcessUpdateableVersionList函数,记录当前版本的asset,resource,fileSystem,创建UpdatableVersionList实例并序列化,用于运行时查找资源映射,可更新版本用,用于手游更新。
- 判断OutputPackedSelected为true,调用ProcessReadOnlyVersionList函数,记录当前版本packed类型的bundle和fileSystem,创建LocalVersionList实例并序列化,用法在后面细看看,更新这块的细节很多。
打资源包-ResourcePackBuilder
以full文件夹中指定版本为基础,找到改变的资源。可以同时打多个版本的资源包,每个版本的资源包相互独立。
BuildResourcePack函数实现打包两个版本之间的差异资源。
流程
- 读取两个版本的GameFrameworkVersion.*.data文件,每个版本内资源信息,保存到对应的UpdateableVersionList实例,对比实例中每个文件,计算需要打包的资源列表。
- 对每个源版本号,调用BuildResourcePack函数
- 读取GameFrameworkVersion,找到需要打包的资源列表,注意不只是资源变了,加载方式变了也要更新文件,所以要避免大bundle加载方式变化。
- 要打包的资源,用ResourcePackVersionList.Resource保存,序列化为一个或几个大的文件,大小上限可选。
- 打包后保存到ResourcePack对应的版本文件夹中,并上传到资源服务器。
总结一下用法
- 首先在ResourceEditor编辑bundle内容,基本上是基于文件夹结构,特殊的手动,然后保存xml文件。
- ResourceBuilder界面配置打包的信息和版本,如果build,版本号自动加一,在界面打包不会自动加。
- 如果打包失败,有循环依赖的资源,在ResourceAnalyzer界面查看。
- 资源包,在ResourcePackBuilder界面选择要打包的版本。
- 最后该拷贝到StreamingAssets的就拷贝,该上传资源服务器的就上传。
这个工具只提供了打包bundle,apk的自动化,以及文件上传等需要项目自己加。