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

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

http://www.xdnf.cn/news/5304.html

相关文章:

  • 模型过拟合是什么?
  • 【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
  • AI智慧公园管理方案:用科技重塑市民的“夜游体验”
  • 【C++】内存管理 —— new 和 delete
  • Lora原理及实现浅析
  • 【C++】特殊类设计
  • 支持向量机与逻辑回归的区别及 SVM 在图像分类中的应用
  • matlab中的积分函数
  • 【Java学习日记34】:this关键字和成员变量
  • armv7 backtrace
  • LoRA(Low-Rank Adaptation)原理详解
  • 【ajax基础】
  • 深入理解深度Q网络DQN:基于python从零实现
  • OB Cloud 云数据库V4.3:SQL +AI全新体验
  • redis主从同步于对象模型
  • 【基于 LangChain 的异步天气查询2】GeoNames实现地区实时气温查询
  • EDITPLUS配置CTags实现函数跳转
  • 技术方案模型需要兼顾战略规划、技术实现与落地可行性
  • 《操作系统真象还原》第十三章——编写硬盘驱动程序
  • SQL注入问题
  • powerbuilder9.0中文版
  • 7、系统开发
  • 计算机网络 4-2-1 网络层(IPv4)
  • 每日算法-250510
  • 深入理解Embedding技术-什么是Embedding?
  • 使用fdisk 、gdisk管理分区
  • Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力
  • python:ASCII-generator 实用教程
  • $\int_{0}^{1} x \arcsin \sqrt{4x - 4x^2}dx$
  • LintCode第366题-斐波那契数列