目录
正文
上一篇文章讲了如何收集打包资源,得到了一个List<AssetInfo>
下面正式进入打包流程,调用PostAssetBuild方法即可开始正式打包流程
public void PostAssetBuild()
{
Debug.Log("------------------------------OnPostAssetBuild------------------------------");
// 准备工作
List<AssetBundleBuild> buildInfoList = new List<AssetBundleBuild>();
List<AssetInfo> buildMap = GetBuildMap();
if (buildMap.Count == 0)
throw new Exception("[BuildPatch] 构建列表不能为空");
Log($"构建列表里总共有{buildMap.Count}个资源需要构建");
for (int i = 0; i < buildMap.Count; i++)
{
AssetInfo assetInfo = buildMap[i];
AssetBundleBuild buildInfo = new AssetBundleBuild();
buildInfo.assetBundleName = assetInfo.AssetBundleLabel;
buildInfo.assetBundleVariant = assetInfo.AssetBundleVariant;
buildInfo.assetNames = new string[] { assetInfo.AssetPath };
buildInfoList.Add(buildInfo);
string createdLabel = $"{assetInfo.AssetBundleLabel}.{assetInfo.AssetBundleVariant}".ToLower();
if(!_labelToAssets.TryGetValue(createdLabel, out var list))
{
list = new List<AssetInfo>();
_labelToAssets.Add(createdLabel, list);
}
list.Add(assetInfo);
}
// 开始构建
Log($"开始构建......");
//参数3在前面的文章已经讲过了
BuildAssetBundleOptions opt = MakeBuildOptions();
AssetBundleManifest buildManifest = BuildPipeline.BuildAssetBundles(OutputPath, buildInfoList.ToArray(), opt, BuildTarget);
if (buildManifest == null)
throw new Exception("[BuildPatch] 构建过程中发生错误!");
}
调用GetBuildMap()获取打包资源在上一篇文章有代码
下一步就是处理List<AssetInfo>,把它变成打包API能识别的List<AssetBundleBuild>
BuildAssetBundleOptions opt 参考该系列文章第一篇
写一个GUI界面,点击build时调用PostAssetBuild(),还可以手动选择BuildAssetBundleOptions的相关参数。

插入一个知识点
压缩大小:lzma比lz4小。
压缩与解压缩时间:lzma远高于lz4.
现在项目都选LZ4的原因,LZ4比LZMA压缩和解压缩都快,就算LAMA压缩的小也不用它。
LZ4还有一个优势,调用LoadFromFile加载AB包时,只会加载AB包的Header,这一步加载并不会发生解压缩的,之后需要什么资源再加载那部分的AB包chunk,加载资源时才会发生解压缩,极大的减少了内存占用。
打包后的的文件夹内有这些文件

看上图,3个名字特别长的就是资源包,为何是3个包,因为我的打包目标路径是Assets/Works/Resource,而该目录下正好有3个资源

UnityManifest.manifest文件是所有AB包的记录文件,同时也会记录该AB包引用了哪些AB包,用NotePad++打开UnityManifest.manifest文件

很明显, AssetBundleInfos:就是外面文件夹的三个ab包,为何每个AB包的名字是一长串数字,原因是在打包设置中,我把ab包的名字转换成了MD5码,在文章3中有介绍。
下面是一个AB包的引用信息。

上文完成了一次打包,并且成功打包除了目标文件,美中不足的是,UnityManifest.manifest虽然记录了每个AB包的名字以及依赖AB包信息,但是,这些信息没有包含该AB包的版本信息、版本号,以及没有显示我们的版本信息,还有就是前篇文章提到的,该AB包是启动时热更,还是游戏内热更。因此,我们需要对UnityManifest.manifest进行二次优化。详情见下篇文章