当前位置: 首页 > news >正文

Unity中AssetBundle使用整理(一)

一、AssetBundle 概述

AssetBundle 是 Unity 用于存储和加载游戏资源(如模型、纹理、预制体、音频等)的一种文件格式。它允许开发者将游戏资源打包成独立的文件,在运行时动态加载,从而实现资源的按需加载、更新以及减小初始安装包大小等功能。

用途:

减小初始安装包大小:将部分资源(如非首发场景资源、后期更新资源)以 AssetBundle 形式打包,不在初始安装包中包含,降低安装包体积。
资源动态更新:在游戏发布后,可以通过下载新的 AssetBundle 文件来更新游戏资源,无需发布新的游戏版本,实现快速迭代和内容更新。
资源复用:多个场景或项目可以共享相同的 AssetBundle 资源,提高资源利用效率。

二、AssetBundle 的创建

1. 资源标记

1.在 Unity 编辑器中,通过 Inspector 面板为需要打包进 AssetBundle 的资源设置 AssetBundle 名称和变体(Variant)。变体可用于区分不同平台、画质等级等版本的资源。
2.通过脚本方式设置。
代码:使用AssetImporter设置ab包名和变体名,可以设置没有提前配置的包名和变体名

public static class AssetBundleSetter
{[MenuItem("Tools/Set AssetBundle Name")]static void SetAssetBundleName(){// 获取资源路径string assetPath = "Assets/Res/buffIcon_Speed.png";// 获取资源的 AssetImporterAssetImporter 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。此方法需要指定输出路径、构建选项和目标平台。
代码:

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

相关文章:

  • Java NIO 文件处理接口
  • GO语言-导入自定义包
  • Linux基础io知识
  • [超详细,推荐!!!]前端性能优化策略详解
  • 如何实现并运用责任链模式
  • 当虚拟照进现实——《GTA6》如何重新定义开放世界的可能性‌
  • Python3安装HTMLTestRunner
  • 【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)
  • 使用lldb看看Rust的HashMap
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十七)
  • 害怕和别人发生冲突怎么办? --deepseek
  • lampiao靶场渗透
  • springboot3学习
  • Problem E: 实现冒泡排序(内存优化)
  • Linux常见指令解析(三)
  • 《打造自己的DeepSeek》第2期:怎么安装自己的DeepSeek?
  • 【Tools】VScode远程调试linux服务器(打断点可视化界面方式)
  • 基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块
  • redis数据结构-04 (HINCRBY、HDEL、HKEYS、HVALS)
  • 冰箱拆解学习
  • 中方在世贸组织对美国“对等关税”表达关注,呼吁维护多边主义
  • 贵州已设立省地质矿产局、省地质矿产开发院
  • 谷歌推出AI全家桶订阅计划:每月付费250美元,搜索引擎加入AI模式
  • 为配合铁路建设,上海地铁3号线将在这两个周末局部缩时运营
  • 上海乐高乐园客流预测来了:工作日0.8万人次/日,周末节假日2万人次/日
  • 国家发改委:城市更新项目必须建立多元化多层级资金投入机制