Addressables 系统概述
Addressables 提供了一个可以随着您的项目而增长的系统。您可以从一个简单的设置开始,然后随着项目的复杂性和团队规模的增长而重新组织,并且您只需更改最少的代码即可完成所有这些工作。
例如,您可以从一组可寻址资产开始,Unity 将其作为一组加载。然后,随着您添加更多内容,您可以将您的资产分成多个组,以便您可以在给定时间仅加载您需要的那些。随着团队规模的扩大,您可以制作单独的 Unity 项目来开发不同类型的资产。这些辅助项目可以生成您从主项目加载的自己的可寻址内容构建(同样只需最少的代码更改)。
本概述讨论了以下概念,以帮助您了解如何通过 Addressables 系统管理和使用您的资产:
-
资产地址:标识可寻址资产的字符串 ID。您可以使用地址作为加载资产的key。
-
AssetReferences:一种可用于支持将可寻址资产分配到检查器窗口中的字段的类型。您可以使用 AssetReference 实例作为加载资产的键。 AssetReference 类还提供了自己的加载方法。
-
资产位置:一个运行时对象,描述如何加载资产及其依赖项。您可以使用位置对象作为加载资产的键。
-
键:标识一个或多个可寻址对象的对象。键包括地址、标签、AssetReference 实例和位置对象。
-
资产加载和卸载:Addressables API 提供了自己的函数来在运行时加载和释放资产。
-
依赖项:资产依赖项是一种资产被另一种资产使用,例如场景资产中使用的预制件或预制件资产中使用的材质。
-
依赖和资源管理:Addressables 系统使用引用计数来跟踪正在使用的资产和 AssetBundle,包括系统是否应该加载或卸载依赖项(其他引用的资产)。
-
组:您在编辑器中将资产分配给组。组设置决定了 Addressables 如何将组资产打包到 AssetBundles 中以及它如何在运行时加载它们。
-
内容目录:Addressables 使用目录将您的资产映射到包含它们的资源。
-
内容构建:在使用 Addressables 时,在进行player 构建之前,您可以将内容构建作为单独的步骤来整理和打包您的资产。
-
多平台支持:构建系统分离平台构建的内容,并在运行时解析正确的路径。
-
Addressables 工具:Addressables 包包含多个用于组织、构建和优化内容的窗口和工具。
默认情况下,Addressables 使用 AssetBundles 来打包您的资产。您还可以实现自己的 IResourceProvider 类以支持其他访问资产的方式。
资产地址
Addressables 系统的一个关键特性是您为资产分配地址并使用这些地址在运行时加载它们。 Addressables 资源管理器在内容目录中查找地址以找出资产的存储位置。 (资产可以内置到您的应用程序、本地缓存或远程托管。)资源管理器加载资产和任何依赖项,如有必要,首先下载内容。
Addressables 按地址加载资产,无论它们位于何处
由于地址与资产的物理位置无关,因此在 Unity 编辑器和运行时管理和优化资产时,您具有更大的灵活性。内容目录将地址映射到物理位置。
尽管您通常应该为您的资产分配唯一的地址,但资产地址不需要是唯一的。如果有用,您可以将相同的地址字符串分配给多个资产。例如,如果您有资产的变体,您可以为所有变体分配相同的地址并使用标签来区分变体:
- Asset 1: address: “plate_armor_rusty”, label: “hd”
- Asset 2: address: “plate_armor_rusty”, label: “sd”
仅加载单个资产的可寻址 API 函数,例如 LoadAssetAsync,如果您使用分配给多个资产的地址调用它们,则会加载找到的第一个实例。其他函数,如 LoadAssetsAsync,在一个操作中加载多个资产,并加载指定地址的所有资产。
TIP
您可以使用 LoadAssetsAsync 的 MergeMode 参数来加载两个键的交集。
在上面的示例中,您可以指定地址“plate_armor_rusty”和标签“hd”作为键和交叉点作为加载“资产 1”的合并模式。您可以将标签值更改为“sd”以加载“资产 2”。
有关如何为资产分配地址的信息,请参阅使资产可寻址。
有关如何通过键(包括地址)加载资产,请参阅加载资产。
AssetReference
AssetReference 是一种可以设置为任何类型的可寻址资产的类型。 Unity 不会自动加载分配给引用的资源,因此您可以更好地控制何时加载和卸载它。
在 MonoBehaviours 和 ScriptableObjects 中使用 AssetReference 类型的字段来帮助您指定要用于该字段的可寻址资产(而不是使用指定地址的字符串)。 AssetReferences 支持拖放和对象选择器分配,这可以使它们更方便地在编辑器检查器中使用。
除了基本的 AssetReference 类型之外,Addressables 还提供了一些更专业的类型,例如 AssetReferenceGameObject 和 AssetReferenceTexture。您可以使用这些专门的子类来消除将错误类型的资产分配给 AssetReference 字段的可能性。此外,您可以使用 AssetReferenceUILabelRestriction 属性来限制对具有特定标签的资产的分配。
加载和释放资产
要加载可寻址资产,您可以使用其地址或其他键,例如标签或 AssetReference。有关更多信息,请参阅加载可寻址资产。您只需要加载主要资产; Addressables 自动加载任何依赖资产。
当您的应用程序在运行时不再需要访问可寻址资产时,您必须释放它,以便可寻址资产可以释放相关内存。 Addressables 系统保留加载资产的引用计数。在引用计数归零之前,它不会卸载资产。因此,您无需跟踪资产或其依赖项是否仍在使用;您只需要确保在任何时候显式加载资产时,在应用程序不再需要该实例时将其释放。有关更多信息,请参阅发布可寻址资产。
依赖和资源管理
Unity 中的一项资产可以依赖于另一项资产。一个场景可能引用一个或多个预制件; Prefab 可能使用一种或多种材料。相同的材质可以被多个预制件使用,并且这些预制件可以存在于不同的 AssetBundle 中。当您加载可寻址资产时,系统会自动查找并加载它引用的任何相关资产。当系统卸载资产时,它也会卸载它的依赖项——除非它们仍然被不同的资产使用。
当您加载和释放资产时,Addressables 系统会为每个项目保留一个引用计数。当资产不再被引用时,Addressables 将其卸载。如果资产位于不再包含任何正在使用的资产的捆绑包中,Addressables 也会卸载捆绑包。
可寻址组和标签
使用可寻址组来组织您的内容。所有可寻址资产都属于一个组。如果您没有明确地将资产分配给一个组,Addressables 会将其添加到默认组中。
您可以设置组设置以指定 Addressables 构建系统应如何将组中的资产打包成包。例如,您可以选择是否应将组中的所有资产打包到一个 AssetBundle 文件中。
使用标签来标记您希望以某种方式一起处理的内容。例如,如果您为“red”、“hat”和“feather”定义了标签,则可以在一次操作中加载所有带有羽毛的红帽子,无论它们是否属于同一 AssetBundle。此外,您可以使用标签来确定如何将组中的资产打包成bundle。
使用可寻址组窗口将资产添加到组并在组之间移动资产。您还可以在“组”窗口中为您的资产分配标签。
组模式
分配给组的模式定义用于在组中构建资产的设置。不同的模式可以定义不同的设置组。例如,一个标准模式定义了如何将您的资产打包和压缩到 AssetBundles(以及其他选项)中的设置。另一个标准模式定义了组中的资产属于“可以更改发布后”和“无法更改发布后”中的哪些类别。
您可以定义自己的架构以与自定义构建脚本一起使用。
内容目录
Addressables 系统生成一个内容目录文件,将您的资产地址映射到它们的物理位置。 Addressables 为每个项目生成一个内容目录,但您可以加载由其他 Unity 项目创建的目录以加载由这些项目生成的可寻址资产。这允许您使用单独的项目来开发和构建您的一些资产,这可以使大型制作的迭代和团队协作更容易
当 Addressables 生成内容目录时,它还会创建一个包含目录哈希(数学指纹)的哈希文件。如果您远程托管您的可寻址资产,系统将使用此哈希文件来确定内容目录是否已更改并需要下载
执行内容构建时选择的配置文件决定了内容目录中的地址如何映射到资源加载路径。有关详细信息,请参阅配置文件。
内容构建
Addressables 系统将 Addressable 内容的构建与player的build分开。内容构建会生成内容目录、目录哈希和包含您的资产的 AssetBundles。
由于资产格式是特定于平台的,因此您必须在构建player之前为每个平台构建内容。
Play模式脚本
当您在编辑器播放模式下运行您的游戏或应用程序时,总是在按下播放按钮之前执行内容构建可能既不方便又缓慢。同时,您确实希望能够在尽可能接近内置玩家的状态下运行您的游戏。为了灵活性,Addressables 提供了三个选项来确定 Addressables 系统如何在 Play 模式下定位和加载资产:
- 使用资产数据库:Addressables 直接从资产数据库加载资产。如果您同时进行代码和资产更改,此选项通常提供最快的迭代速度,但也最不类似于生产构建。
- 模拟组:可寻址对象在模拟组时加载资产。如果您正在组织和优化您的可寻址组本身,则此选项很有用。它提供可寻址事件,而无需在每次更改后重新构建完整的内容。
- 使用现有构建:Addressables 从上次内容构建加载内容。此选项最类似于生产构建,如果您不更改资产,则可以提供快速迭代周转。
支持多平台
Addressables 支持为多个平台设计的项目,方法是在构建路径中包含目标平台名称,并确保在您构建player时将正确的平台文件复制到 StreamingAssets 文件夹。