一、生成资源Bundle文件
生成Bundle文件主要是如何对资源进行设置Bundle名及其分类的过程。目前有两种方式,第一种就是在编辑器里面设置每个资源的Bundle名称(如图1),这是最简单直观的操作方式;另一种方式就是通过编写代码并配合资源配置文件进行控制,先通过代码遍历项目工程的资源然后根据资源配置设置其Bundle名称,也可以暴力的按照资源类型进行分类,由于不同项目的控制方式不同,因此就不过多介绍。
图1
将资源都设置好对应的Bundle名称后,即可进行生成Bundle文件的操作,其代码就相对简单(如图2),只需调用Unity现成的API接口。在Assets/Editor(如果没有需创建)目录中创建一个合适名称的cs文件,里面加入一个生成Bundle的方法如下。然后就可以通过菜单上面的Tools/BuildBundleDefault生成Bundle文件。
图2
[注意事项]
1. Scene文件不能与其他资源文件设置为同一个Bundle,否则会报错误。但是多个Scene文件可以设置为同一个Bundle。
2. 需要记录资源和Bundle以及相关依赖的关系到文件,以便在加载的时候使用。
二、打包Apk包
从今天也就是2021年8月1日起,上架Google的包必须是aab格式,但暂时依然先打apk包,后续文章将带来如何打aab包。同一是在Editor目录创建一个用于写打包apk代码的cs文件。这里我略去了许多的属性设置及资源检查处理相关的代码(Bundle文件全部已放在Assets/StreamingAssets目录)。
图4 注意“加密方式”写错应该是压缩方式
三、运行时加载资源
运行时加载游戏资源前首先需要加载Bundle文件,这里需要注意的就是同一个Bundle在没有卸载前不能重复加载,否则会报错。
图5
Bundle加载完成后,就可以通过bundle.LoadAsset<GameObject>(资源路径)获取对应的对象,然后进行初始化显示。
图6
[注意事项]
1. 在生成Bundle的时候有特别说明需要将资源与Bundle的关系记录下来,其目的就是加载资源时加载的接口只需传入要加载的资源名称即可,而无需关心其在哪个Bundle中,当然加载接口内部需实现先通过资源名称查找Bundle并进行加载后,在返回对应的资源。
2. 如果这个资源有依赖的资源在其他的Bundle,也需要将其他的Bundle加载进来,否则就会出现丢失资源的问题。
3. 加载场景的方式比较特殊需要单独处理。
四、总结
本篇介绍了生成Bundle文件、打apk包、然后运行时加载Bundle文件读取资源的流程。主体的流程就这么多,打包过程中还可以加入很多其他的流程,例如资源检查、插件打包选择等等。关于Android App Bundle(AAB)包目前已经完成了整体的打包和加载流程,为了确保准确性将会在Google商店上架测试之后再做介绍。
文章来自我的公众号,大家如果有兴趣可以关注,具体扫描关注下图。