Version: Unity 6.0 (6000.0)
语言 : 中文
Creating AssetBundles
Assign assets to an AssetBundle

为 AssetBundle 准备资源

定义 AssetBundle 时需要注意一些规则:

  • 场景和资源不能同时包含在同一个 AssetBundle 中。单个 AssetBundle 只能包含__场景_或_资源。
  • 不能将特定场景或资源分配给多个 AssetBundle
  • AssetBundle 不能包含脚本资源
  • StreamingAssets 文件夹中的文件不能放入 AssetBundle
  • AssetBundle 名称不能与输出文件夹的名称相同
  • AssetBundle 只能在为其构建的特定平台上加载。
  • 编辑器可以加载任何 AssetBundle,无论当前激活的平台配置文件如何。但是,如果 AssetBundle 中的单个资源使用编辑器平台上不支持的特定于平台的格式,则可能无法成功加载或渲染这些资源。例如,Android 着色器可能在 Windows 编辑器中渲染为洋红色。

除了这些规则,您可以将任何资源分配给所需的任何捆绑包。但是,在设置捆绑包时需要考虑某些策略。

逻辑实体分组

逻辑实体分组策略可用于决定如何整理进入每个项目 AssetBundle 的内容。原则就是,根据每段内容所代表的项目功能部分做出决定。这包括各种不同部分,比如用户界面、角色、环境以及在应用程序整个生命周期中可能经常出现的任何其他内容。

示例

  • 捆绑用户界面屏幕的所有纹理和布局数据
  • 捆绑一个/一组角色的所有模型和动画
  • 捆绑在多个关卡之间共享的景物的纹理和模型

按逻辑实体分组整理 AssetBundle 非常适合用于可下载内容 (DLC),因为这样您就能更轻松地小范围更改项目,无需用户重新下载大量其他未更改的资源。

为了能够正确实施此策略,最大诀窍在于,负责为各自捆绑包分配资源的开发人员必须熟悉项目使用每个资源的准确时机和场合。

类型分组

使用类型分组策略时,可以将相似类型的资源(例如音频轨道或语言本地化文件)分配到单个 AssetBundle。

类型分组可用于建立很少更改的 AssetBundle。以这种方式对 AssetBundle 进行分组可能会减少 AssetBundle 的更改,并在增量构建完成后需要分发。缺点是可能需要下载和加载更多 AssetBundle 才能在运行时将所有依赖对象集合起来。

并发内容分组

并发内容分组是指将需要同时加载和使用的资源捆绑在一起。可以将这些类型的捆绑包用于基于关卡的游戏(其中每个关卡包含完全独特的角色、纹理、音乐等)。有时您可能希望确保其中一个 AssetBundle 中的资源与该捆绑包中的其余资源同时使用。依赖于并发内容分组捆绑包中的单个资源会导致加载时间显著增加。您将被迫下载该单个资源的整个捆绑包。

并发内容分组捆绑包最常见的用例是针对基于场景的捆绑包。在此分配策略中,每个场景捆绑包应包含大部分或全部场景依赖项。

注意:构建包含场景的 AssetBundle 时,该场景引用的任何资源也会自动包含在 AssetBundle 中,除非这些资源被显式分配给不同的 AssetBundle。在进行并发内容分组时,这很方便,但如果任何引用的资源也被其他场景使用,而您正在将这些场景构建到单独 AssetBundle 中的,则需要注意是否有重复的资源。

更多提示

项目绝对可以也应该根据您的需求混用这些策略。对任何给定情形使用最优资源分配策略可以大大提高项目的效率。

例如,一个项目可能决定将不同平台的用户界面 (UI) 元素分组到各自的 Platform-UI 特定捆绑包中,但按关卡/场景对其交互式内容进行分组。

无论遵循何种策略,下面这些额外提示都有助于掌控全局:

  • 将频繁更新的对象与很少更改的对象拆分到不同的 AssetBundle 中
  • 将可能同时加载的对象分到一组。例如模型及其纹理和动画
  • 如果发现多个 AssetBundle 中的多个对象依赖于另一个完全不同的 AssetBundle 中的单个资源,请将依赖项移动到单独的 AssetBundle。如果多个 AssetBundle 引用其他 AssetBundle 中的同一组资源,一种有价值的做法可能是将这些依赖项拉入一个共享 AssetBundle 来减少重复。
  • 如果不可能同时加载两组对象(例如标清资源和高清资源),请确保它们位于不同的 AssetBundle 中。
  • 如果一个 AssetBundle 中只有不到 50% 的资源经常同时加载,请考虑拆分该捆绑包
  • 考虑将多个小型的但经常同时加载内容的 AssetBundle 组合在一起
  • 如果一组对象只是同一对象的不同版本,请考虑使用 AssetBundle 变体
Creating AssetBundles
Assign assets to an AssetBundle