一、AssetBundle 概述
AssetBundle 是 Unity 用于存储和加载游戏资源(如模型、纹理、预制体、音频等)的一种文件格式。它允许开发者将游戏资源打包成独立的文件,在运行时动态加载,从而实现资源的按需加载、更新以及减小初始安装包大小等功能。
用途:
减小初始安装包大小: 将部分资源(如非首发场景资源、后期更新资源)以 AssetBundle 形式打包,不在初始安装包中包含,降低安装包体积。
资源动态更新: 在游戏发布后,可以通过下载新的 AssetBundle 文件来更新游戏资源,无需发布新的游戏版本,实现快速迭代和内容更新。
**资源复用:**多个场景或项目可以共享相同的 AssetBundle 资源,提高资源利用效率。
二、AssetBundle 的创建
1. 资源标记
1.在 Unity 编辑器中,通过 Inspector 面板为需要打包进 AssetBundle 的资源设置 AssetBundle 名称和变体(Variant)。变体可用于区分不同平台、画质等级等版本的资源。
2.通过脚本方式设置。
代码:使用AssetImporter设置ab包名和变体名,可以设置没有提前配置的包名和变体名
cs
public static class AssetBundleSetter
{
[MenuItem("Tools/Set AssetBundle Name")]
static void SetAssetBundleName()
{
// 获取资源路径
string assetPath = "Assets/Res/buffIcon_Speed.png";
// 获取资源的 AssetImporter
AssetImporter importer = AssetImporter.GetAtPath(assetPath);
if (importer != null)
{
// 设置 AssetBundle 名称和变体
importer.assetBundleName = "obj1"; // 主名称
importer.assetBundleVariant = "unity3d"; // 变体后缀
// 保存设置
importer.SaveAndReimport();
Debug.Log($"已设置: {assetPath} -> {importer.assetBundleName}.{importer.assetBundleVariant}");
}
else
{
Debug.LogError($"资源不存在: {assetPath}");
}
AssetDatabase.Refresh(); // 刷新数据库
}
}
注:变体(Variant)是什么?
变体是与其一起存储的 AssetBundle 的选项或子类,允许同一组资源的不同变体(如高清/标清材质、多语言文本)共享相同的加载逻辑,运行时动态选择合适版本。
2.构建 AssetBundle
使用BuildPipeline.BuildAssetBundles方法来构建 AssetBundle。此方法需要指定输出路径、构建选项和目标平台。
代码:
cs
public class BuildAssetBundle : MonoBehaviour
{
[MenuItem("Tools/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if (!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
}
结果:

3.资源分组
1.逻辑实体分组
逻辑实体分组是指根据资源所代表的项目功能部分将资源分配给 AssetBundle。这包括各种不同部分,比如用户界面、角色、环境以及在应用程序整个生命周期中可能经常出现的任何其他内容。非常适合于可下载内容 (DLC),因为通过这种方式将所有内容隔离后,可以对单个实体进行更改,而无需下载其他未更改的资源。
逻辑实体分组例如:
1.用户界面屏幕的所有纹理和布局数据。
2.一个/一组角色的所有模型和动画。
3.在多个关卡之间共享的景物的纹理和模型。
2.类型分组
将相似类型的资源(例如音频轨道或语言本地化文件)分配到单个 AssetBundle。
3.并发内容分组
将需要同时加载和使用的资源放到一个AssetBundle。可以将这些类型的捆绑包用于基于关卡的游戏(其中每个关卡包含完全独特的角色、纹理、音乐等)。最常见的用例是针对基于场景的AssetBundle包。在此分配策略中,每个场景AssetBundle包应包含大部分或全部场景依赖项。
注:以下
1.将频繁更新的对象与很少更改的对象****拆分到不同的 AssetBundle 中
2.将可能同时加载的对象分到一组。例如模型及其纹理和动画
3.如果发现多个 AssetBundle 中的多个对象依赖于另一个完全不同的 AssetBundle 中的单个资源,请将依赖项移动到单独的 AssetBundle。如果多个 AssetBundle 引用其他 AssetBundle 中的同一组资源,一种有价值的做法可能是将这些依赖项拉入一个共享 AssetBundle 来减少重复。
4.如果不可能同时加载两组对象(例如标清资源和高清资源),请确保它们位于各自AssetBundle 中,即分到两个包里。
5.如果一个 AssetBundle 中只有不到 50% 的资源经常同时加载,请考虑拆分该捆绑包,即加载后使用时有冗余部分,请拆分AB包。
6.考虑将多个小型的(少于 5 到 10 个资源)但经常同时加载内容的 AssetBundle 组合在一起。
7.如果一组对象只是同一对象的不同版本,请考虑使用 AssetBundle 变体。
三、AssetBundle 的加载与卸载
四、AssetBundle 的依赖管理
五、AssetBundle 的版本控制
未完待续。。。
参考:
《Unity3D游戏开发第三版》
AssetBundle 简介 - 2019.4 - Unity Learn