打包策略和打包工具
打包策略
- 设置编辑器工具统一设置AB包名及路径管理
- 根据依赖关系(自定义依赖关系表)生成不冗余AB包
- 基于Asset的全路径生成自己的依赖关系表
- 根据自己的依赖关系加载AB包
优点:在编辑器环境下,不需要打包;不会产生冗余AB包;文件夹或文件AB包设置简单方便管理。
整个思路就是Unity自己的Addressable打包方式
缺点:长时间未打包的情况下,用于生成目录所需要的时间比较长。
为什么会产生冗余:
如果我们给一个资产文件打上一个AB包名,给包含此资产的文件夹打上另一个AB包名,那么此资产就会产生冗余
如果我们给一个图片打上一个AB包名,给依赖此图片的另一个Prefab打上另一个AB包名,又会产生冗余??
自定义打包配置SO
基于Assets序列化生成编辑器打包配置SO,表里的设置主要分为两种:
- 基于文件夹下所有单个prefab文件进行打包
- 基于文件夹进行打包
ABConfig脚本
在Editor文件夹内新建ABConfig
脚本
1 | using System.Collections.Generic; |
这是一个简单的配置表示例,我们可以新建一个ABConfig,然后在“All Prefab Path”里填写所有Prefab文件所在文件夹的Path如:“Assets/Prefabs”;
在“All File Dir AB”里填写文件夹路径和这个文件夹所需要指定的AssetBundle名称(一般都是纯小写),如:
1 | AB Name: shader |
注意
Prefab文件夹内的各个Prefab名要保证唯一。
生成AB包
- 根据单个Prefab文件和整个文件夹设置AB包
- 剔除冗余AB包
- 生成AB包配置表(xml)
修改Editor文件夹下的BundleEditor
脚本:
1 | using System.Collections; |
文件夹AB包的名称需要自己指定,而PrefabAB包的名称和Prefab的名称一致
PrefabAB包的依赖项中,没有包含在“文件夹AB包”内的依赖项,会设置成和prefab同名的AB包
在
DeleteAB
方法中,如果一个ab包需要删除,它的meta文件我们不主动删除(可以看到我们跳过了),Unity会自动处理meta文件。尽量不手动删除它。
当我们把工程内的资源或文件夹设置了AB包名后,它们对应的meta文件会记录此设置:
1 | fileFormatVersion: 2 |
在实际项目中,使用SVN或GIT会同时更新每个资产对应的meta文件,当我们设置了asset bundle,同时会有大量的meta文件需要更新,但其实这是不必要的,因为我们每次打Build AB包时都会重新设置asset bundle,所以在打包完成后要清除所有的ab包的名称设置(使用
AssetDatabase.RemoveAssetBundleName(oldNames[i], true);
)
打包的基本顺序是:
- 先设定文件夹AB包和不重复的PrefabAB包的AB包名称
- 根据名称打包,并在打包过程中生成配置表
- 删除所有AB包名,保证meta文件不修改
AssetBundleConfig
我们在Script文件夹中新建一个AssetBundleConfig
类,用于在打包时生成xml配置文件和二进制配置文件
1 | using System.Collections.Generic; |
我们在打包的过程中生成配置文件,分为两种,一种是xml配置文件,方便在编辑器环境下查看,一种是二进制配置文件,用于传输和运行时使用。
我们在生成二进制配置文件时,将二进制配置文件生成在需要打AB包的文件夹内
1 | private static string bytePath = "Assets/GameData/Data/ABData/AssetBundleConfig.bytes";//此为AB包文件夹 |
注意,在一开始”Assets/GameData/Data/ABData/”中是没有文件的,我们需要随便加点
AssetBundleConfig.bytes
同名文件进去,否则Unity可能不会给空文件夹打AB包名
CRC32
我们在Script文件夹新建个CRC32
类,这是一个工具类,用于生成crc,为了快速在内存中定位AB包
CRC对内存更加友好,也更加高效。所以使用CRC标记
1 | using System; |
简单读取AB包
1 | void TestLoadAB() |