Version: 6000.3
语言: 中文
创建资产包
将资产构建到 AssetBundle 中

将资产组织到资产包中

创建 AssetBundle 时,需要注意一些限制和组织策略。

您可以通过以下方式组织资产:

  • 功能:根据项目的功能部分组织资产。典型类别可能包括用户界面、字符、环境以及整个应用程序中经常使用的其他元素。
  • 按类型:类型分组侧重于将相同类型的资产捆绑在一起,例如音轨或本地化文件。
  • 按运行时使用:对同时加载和使用的资产进行分组。此策略通常用于基于级别的项目。

您可以在项目中混合使用这些策略,以获得应用程序的最佳效率。例如,您可以将不同平台的UI元素分组到一个AssetBundle中,但按级别或场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
.

AssetBundle 限制

你可以将哪些资产放入AssetBundle中,以及如何设置它们,有一些限制。下表包含 AssetBundle 的限制:

限度 描述
文件类型
  • 您无法将场景和资产合并到一个 AssetBundle 中。您必须将场景存储在与包含资产的单独的 AssetBundle 中。
  • 您不能在 AssetBundles 中包含脚本资产。
  • 不能将文件包含在 StreamingAssets 文件夹中。
  • 您不能将资产或场景分配给多个 AssetBundle。
命名 AssetBundle的名称必须与输出文件夹不同。
平台支持 AssetBundle 只能加载到你为其构建它们的特定平台上。编辑器可以加载任何AssetBundle,而不管构建配置文件目标平台创建构建时使用的一组可自定义配置设置。更多信息
请参阅术语表
,但如果某些资产使用安装编辑器的作系统不支持的特定于平台的格式,则可能无法正确加载。

一般组织提示

无论采用哪种组织方法,最佳做法都是遵循以下一般准则:

  • 将经常更新的对象与很少更改的对象分开到不同的 AssetBundle 中。
  • 为不太可能同时加载的对象集创建单独的 AssetBundle,例如标准资产和高清资产。您可以使用 AssetBundle 变体来组织此内容。
  • 将通常加载在一起的对象组合在一起。例如,模型、其纹理和动画。
  • 如果同时加载的 AssetBundle 内容少于一半,则拆分其内容。
  • 如果内容经常同时加载,则合并小型资产包。
  • 如果一个 AssetBundle 中的多个对象依赖于另一个 AssetBundle 中的单个资产,请考虑将依赖项移动到其自己的 AssetBundle。同样,如果多个 AssetBundle 引用同一组资产,请考虑将依赖项放入共享的 AssetBundle 中。

AssetBundle 变体

您可以使用 AssetBundle 变体创建针对不同情况或配置(例如不同的图形设置)进行优化的 AssetBundle 的多个版本。例如,您可以为低分辨率、中分辨率和高分辨率纹理创建变体,以支持具有不同性能或用户选择的图形设置的设备。

使用 AssetBundle 变体时,Unity 允许您为每个 AssetBundle 指定变体名称。AssetBundle 名称和变体名称的组合唯一标识每个 AssetBundle 变体。例如,名为environment可能有名为lowQuality,mediumQualityhighQuality.

AssetBundles 中的资产文件名必须匹配,但内容可能会因变体的用途而异。

您可以在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表
,使用AssetBundle旁边的变体下拉菜单,或使用AssetImporter.assetBundleVariant.

按功能组织资产

在以下情况下,根据资产的功能协同工作方式来组织资产很有用:

  • 捆绑 UI 屏幕的所有纹理和布局数据。
  • 捆绑一个角色或一组角色的所有模型和动画。
  • 捆绑跨多个级别共享的风景片段的纹理和模型。

这种方法非常适合可下载内容 (DLC),因为您可以对项目进行小的更改,而无需向用户分发大量未更改的资产。但是,使用此方法时,您必须熟悉每个资产在项目中的使用位置和时间。

按类型组织资产

你可以将类似类型的资产(如音轨或语言本地化文件)组织到单个资产包中,这在很少更改的资产包中非常有用。

以这种方式对资产包进行分组可以减少在创建增量构建时更改和需要分发的资产包。但是,可能需要下载和加载更多 AssetBundle,以便在运行时将所有依赖对象组合在一起。

按运行时使用情况组织资产

您可以将 Unity 同时加载和使用的资产组合在一起,如果您想根据场景加载 AssetBundle,这非常有用。例如,您可以将此方法用于基于关卡的游戏,其中每个关卡都包含唯一的资产,并且 AssetBundle 包含场景的所有依赖项。

但是,这种方法意味着一个 AssetBundle 中的资产只能在使用其余资产的同时使用,否则会增加加载时间。

重要包含场景的 AssetBundle 会自动包含该场景中引用的所有资产,除非它们被显式分配给单独的 AssetBundle。如果任何其他场景使用其他资产包中的引用资产,这可能会导致资产重复。

资产重复

Unity 使用资产数据库来发现对象内置到 AssetBundle 中的所有依赖项。Unity 使用此依赖关系信息来确定要包含在 AssetBundle 中的对象集。

AssetBundle 分配发生在资产级别。资产中显式分配给 AssetBundle 的对象仅包含在该特定 AssetBundle 中。根据BuildPipeline.BuildAssetBundles方法,则通过设置其AssetImporter.assetBundleName属性设置为非空字符串,或将其列在AssetBundleBuild.assetNames.

任何属于资产的一部分,如果这些对象不是在资产包中显式分配的,则会包含在包含引用该资产的任何对象的每个资产包中。

例如,如果两个对象被分配给单独的 AssetBundle,但共享对同一依赖对象的引用,则 Unity 会将依赖对象复制到两个 AssetBundle 中。这些重复的依赖项也会被实例化,这意味着这两个副本被视为具有唯一标识符的不同对象。这会增加应用程序 AssetBundle 的总体大小,并且如果加载了两个父 AssetBundle,则会导致将对象的两个单独副本加载到内存中。

避免资产重复

您可以使用以下方法来避免资产重复:

  • 删除共享依赖项:确保不同 AssetBundle 中的对象不共享依赖项。将任何具有共享依赖项的对象放入同一个 AssetBundle 中。注意:这种方法不适用于具有许多共享依赖项的项目,因为它会创建大型资产包,必须经常重建和下载。
  • 控制资产加载:对 AssetBundle 进行细分,以便不会同时加载共享依赖项的 AssetBundle。这种方法适用于基于关卡的游戏等项目。但是,重复的对象会增加 AssetBundle 的构建时间和大小。
  • 依赖资产构建到单个 AssetBundle 中:这种方法消除了资产重复的风险,但也带来了复杂性。应用程序必须跟踪 AssetBundle 之间的依赖关系,并确保在调用任何 AssetBundle 之前加载正确的 AssetBundleAssetBundle.LoadAsset蜜蜂属。

对象依赖关系通过AssetDatabaseAPI,在UnityEditorNamespace。 此 API 仅在 Unity 编辑器中可用,在运行时不可用。 用AssetDatabase.GetDependencies获取特定对象或资产的直接依赖关系。依赖关系可能有自己的依赖关系,因此这可以是递归计算。

可以通过传递AssetBundleBuildstructures 设置为BuildPipeline.BuildAssetBundles,或通过使用AssetImporter应用程序接口。 你还可以创建一个编辑器脚本,以确保所有直接或间接依赖关系当项目请求一个包本身“依赖”另一个包时,就会出现间或传递依赖关系。例如,如果您的项目依赖于alembic@1.0.7包,而包又取决于timeline@1.0.0package,则您的项目直接依赖于 Alembic,间接依赖于 Timeline。更多信息
请参阅术语表
的 AssetBundle 分配给 AssetBundle,或者验证没有两个 AssetBundle 共享尚未显式分配的依赖项。

注意:如果您使用 Addressables 包,则可以使用 Addressables 分析工具来发现重复的资产。

其他资源

创建资产包
将资产构建到 AssetBundle 中