Unity中AssetBundle使用整理(一)

一、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 - Unity 手册

AssetBundle 简介 - 2019.4 - Unity Learn

资源、资源和 AssetBundle - Unity Learn

AssetBundle 简介 - 2019.4 - Unity Learn

相关推荐
虾球xz4 小时前
游戏引擎学习第274天:基于弹簧的动态动画
c++·学习·游戏引擎
虾球xz9 小时前
游戏引擎学习第273天:动画预览
c++·学习·游戏引擎
虾球xz1 天前
游戏引擎学习第269天:清理菜单绘制
c++·学习·游戏引擎
虾球xz1 天前
游戏引擎学习第270天:生成可行走的点
c++·学习·游戏引擎
KhalilRuan1 天前
Unity-Shader详解-其五
unity·游戏引擎
惊鸿醉1 天前
Unity C# 中的 反射 小记
unity·c#·游戏引擎
Yuze_Neko1 天前
C#异步Task,await,async和Unity同步协程
开发语言·unity·c#
七月.末1 天前
【Unity】Unity中修改网格的大小和倾斜网格
unity·游戏引擎
蔗理苦1 天前
2025-05-07 Unity 网络基础7——TCP异步通信
网络·tcp/ip·unity·异步通信