Unity Adressables 使用说明(二)管理 Addressables

组织和管理 Addressables 的主要方式是使用组(groups)和配置文件(profiles)。本节概述了如何使用这些工具来有效地管理 Addressables。

【概述】管理 Addressables

在决定如何管理项目中的资源之前,先熟悉资源如何创建对其他资源的依赖关系。有关依赖关系的更多信息,请参阅 Asset dependencies overview

有关组织资源时需要考虑的策略的更多信息,请参阅 Organizing Addressable assets

使用组(groups)组织 Addressables

Addressable group 是你用来管理 Addressable 资源的主要组织单位。使用 Addressables Groups 窗口创建 Addressable 组、在组之间移动资源,并为资源分配地址和标签(label)。

首次安装和设置 Addressables 包时,它会为 Addressable 资源创建一个默认组。Addressables 系统会默认将你标记为 Addressable 的任何资源分配到这个组。在项目开始时,你可能觉得将资源保存在单个组中是可以接受的。随着内容的增加,你应该创建额外的组,以便更好地控制你的应用程序在任何给定时间加载和保留的资源。

关键组设置包括:

  • Build path(构建路径):在内容构建后保存内容的位置。
  • Load path(加载路径):你的应用程序在运行时查找构建内容的位置。
  • Bundle mode (包模式):如何将组中的内容打包到一个 bundle 中。你可以选择以下选项:
    • 包含所有组资源的一个 bundle
    • 每个组条目的一个 bundle(如果你将整个文件夹标记为 Addressable,并希望它们的内容一起构建,这很有用)
    • 为分配给组资源的每个唯一标签组合创建一个 bundle
  • Content update restriction (内容更新限制):设置此值可以发布较小的内容更新。有关更多信息,请参阅 Content Update Builds。如果你总是发布完整构建来更新应用程序,并且不从远程源下载内容,可以忽略此设置。

除了组设置,你还可以使用以下方法控制 Addressables 在项目中的工作方式:

  • Addressable asset settings(Addressable 资源设置):项目级别的 Addressable 资源设置。
  • Profiles(配置文件):定义一组构建路径设置,取决于构建的目的,可以在它们之间切换。如果你计划远程分发内容,这非常有用。
  • Labels(标签):编辑项目中使用的 Addressable 资源标签。
  • Play mode scripts(Player 模式脚本):选择在编辑器中进入Player 模式时 Addressables 系统如何加载资源。

通过编辑器管理资源

AssetReferences 提供了一种与用户界面(UI)兼容的方式来使用 Addressable 资源。你可以在 MonoBehaviour 和 ScriptableObject 类中包含 AssetReference 字段。然后,可以在 Unity 编辑器中通过将 Addressable 资源拖到 Inspector 窗口中的 AssetReference 字段,或者使用对象选择对话框分配资源。

工具

Addressables 系统提供了以下附加工具来帮助开发:

  • Build layout report(构建布局报告):提供构建生成的 AssetBundles 的描述。
  • Build profile log(构建配置日志):提供有关构建过程性能的信息日志。

组织 Addressable 资源

如何组织资源的最佳方法取决于每个项目的具体要求。规划如何管理项目中的资源时需要考虑的方面包括:

  • 逻辑组织:将资源保存在逻辑类别中,以便更容易理解你的组织方式,并发现位置不对的项目。
  • 运行时性能:如果 AssetBundles 增大或有很多 AssetBundles,性能瓶颈可能会出现。
  • 运行时内存管理:将一起使用的资源放在一起,以帮助降低峰值内存需求。
  • 规模:某些组织资源的方式可能在小型游戏中效果很好,但在大型游戏中则不然,反之亦然。
  • 平台特性 :平台的特性和要求可以在很大程度上影响资源的组织方式。例如:
    • 提供充足虚拟内存的平台可以更好地处理大型 bundle,而虚拟内存有限的平台则不行。
    • 某些平台不支持下载内容,完全排除了远程分发资源的可能性。
    • 某些平台不支持 AssetBundle 缓存,因此在可能的情况下,将资源放入本地 bundle 更高效。
  • 分发:无论是否远程分发内容,都意味着必须将远程内容与本地内容分开。
  • 资源更新频率:将预期经常更新的资源与那些不常更新的资源分开。
  • 版本控制:在同一资源和资源组上工作的人越多,项目中版本控制冲突的机会就越大。

常见策略

组织资源的典型策略包括:

  • 并发使用:将同时加载的资源组合在一起,例如给定关卡的所有资源。这种策略通常在长期内最有效,并有助于减少项目中的峰值内存使用。
  • 逻辑实体:将属于同一逻辑实体的资源组合在一起。例如,用户界面(UI)布局资源、纹理、音效,或者角色模型和动画。
  • 类型:将相同类型的资源组合在一起。例如,音乐文件、纹理。

根据项目的需要,这些策略中的一种可能比其他的更有意义。例如,在有许多关卡的游戏中,根据并发使用来组织资源可能在项目管理和运行时内存性能方面最有效。

同时,对于不同类型的资源,你可能会使用不同的策略。例如,在基于关卡的游戏中,可能会将 UI 资源与菜单屏幕的资源组合在一起,而关卡数据则单独分组。你也可能将一个组中的资源按特定资源类型打包到 bundle 中。

更多信息请参阅 Preparing Assets for AssetBundles

常见平台的策略

Addressables 系统基于你创建的组来创建 AssetBundles。关于这些 AssetBundles 的大小和数量的选择,以及何时加载和卸载它们,对项目的安装时间、加载时间和性能有重大影响。因此,在将 Addressables 资源组织到组中时,选择一个考虑到可能影响项目的指标的策略非常重要。

以下信息描述了一些这些指标,它们在不同平台上的差异,以及如何相应地优化策略。

虽然没有一种适用于所有项目的解决方案,但你应该始终尝试 AssetBundles 仅包含你期望一起卸载的资源。这很重要,因为如果应用程序仍需要同一 AssetBundle 中的任何其他资源,应用程序就不能卸载不再需要的资源。

移动应用

针对移动设备时需要考虑的关键性能指标是应用安装大小、加载时间和下载速度。较小的构建下载和安装时间较短,因此尽量减少应用的大小很重要。移动应用还需要在低功率设备上运行良好。

减少应用大小

较小的最终构建下载速度更快,安装后占用的设备存储空间更少。两者在低功率移动设备上都很重要,因为更快的下载和安装时间可以提高用户保留率。

你可以使用远程内容分发在用户安装应用后交付部分内容。尽量保持尽可能多的内容为远程,以减少应用的初始下载和安装大小。

你可以使用构建报告窗口(Build report window)测量功能对大小的影响。

选择适当的打包内容大小

AssetBundles 的大小影响其加载和卸载速度。对于可能需要在一次游戏会话中加载许多不同关卡的移动应用来说,较多的小型 bundles 可以确保每个 bundle 加载速度更快。

加载的每个 AssetBundle 都有一个小的性能影响,因为每个 AssetBundle 都会增加目录(catalog)的大小。使用太多的小 AssetBundles 会创建一个较大的目录,这比使用较少的大 AssetBundles 对性能的影响更大。检查 StreamingAssets 文件夹中目录的大小以决定适合移动应用的 bundle 数量和大小的最佳平衡。

桌面应用程序

对于桌面设备,下载时间通常比运行时性能和加载时间不那么重要。高端设备上的较大应用可以解释为较长的下载时间,但不能解释为运行时的差性能或内容加载时的长时间延迟。

减少加载时间

对于可以使用更多运行时内存的项目,你可以预加载项目将来需要的 AssetBundles。你可以在现有的等待时间(加载屏幕、内容之间的过渡)或应用程序启动时执行此操作。这样可以增加一次性加载时间,但减少或消除未来预加载 AssetBundles 的加载时间。

优化运行时性能

桌面平台在设备内存和存储方面限制较少。为利用这一点,使用不压缩 AssetBundles 的组设置。未压缩的 AssetBundles 在运行时加载速度更快,补丁更高效,但增加了应用程序大小。

XR 平台

XR 平台的要求和限制通常类似于移动平台。一个关键区别是运行时一致的帧率的重要性。任何卡顿或帧率下降都会导致用户不适。

为了弥补这一点,尽量减少 XR 应用程序在运行时需要做的加载。尽可能预加载 AssetBundles,如前面所述的减少加载时间部分中所述。

Group

【概述】Group

组是 Addressables 系统的主要组织单位。使用 Addressables Groups 窗口创建和管理组及其包含的资源。

为了控制 Unity 在内容构建期间如何处理资源,将 Addressables 组织到组中,并根据需要为每个组分配不同的设置。有关如何组织资源的信息,请参阅 Organizing Addressable Assets

当你开始内容构建时,构建脚本会创建包含组中资源的 AssetBundles。构建脚本根据组的设置和整个 Addressables 系统设置确定要创建的 bundle 数量以及创建它们的位置。有关更多信息,请参阅 Builds

管理和创建组

创建组

要创建一个组:

  1. 转到 Window > Asset Management > Addressables 并选择 Groups 打开 Addressables Groups 窗口。
    有关此窗口功能的详细信息,请参阅 Addressables Groups window
  2. 选择 New > Packed Asset 创建一个新组。如果你已经创建了自己的组模板,它们也会显示在菜单中。
  3. 右键点击新组并选择 Rename 重命名该组。
  4. 再次打开上下文菜单并选择 Inspect Group Settings
  5. 根据需要调整组设置。

对于包含计划与主应用程序一起分发的资源的组,默认设置是一个合理的起点。对于包含计划远程分发的资源的组,必须更改构建和加载路径(build paths 和 load paths)以使用配置 Profile 路径变量的远程版本。要构建用于远程分发的 AssetBundles,还必须在 Addressable 系统设置中启用 Build Remote Catalog 选项。

有关各个设置的更多信息,请参阅 Group settings

向组中添加资源

使用以下方法之一向组中添加资源:

  • Project 窗口将资源拖到 Group 窗口中并放入所需的组中。
  • 将资源从一个组拖到另一个组中。
  • 选择资源在 Inspector 窗口中打开并启用 Addressables 选项。这会将资源添加到默认组。使用组上下文菜单更改哪个组是默认组。
  • 将包含资源的文件夹添加到组中。添加到文件夹中的所有资源都包含在组中。
从组中移除资源

Groups 窗口中选择一个或多个资源,右键点击以打开上下文菜单,然后选择 Remove Addressables。你也可以选择资源并按 Delete 键将资源从组中移除。

添加或移除标签(Label)

Groups 窗口中选择一个或多个资源,然后选择一个已选资源的标签字段。

  • 要分配标签,启用或禁用所需标签的复选框。
  • 要添加、移除或重命名标签,选择 + 按钮,然后选择 Manage Labels。只需添加新标签,选择 + 按钮然后选择 New Label。有关如何使用标签的更多信息,请参阅 Labels

【概述】标签(Label)

标签在 Addressables 系统中有多种用途,包括:

  • 你可以使用一个或多个标签作为 key 来识别在运行时需要加载的资源。
  • 你可以根据分配的标签将组中的资源打包到 AssetBundles 中。
  • 你可以在 Groups 窗口的过滤框中使用标签来帮助查找已打标签的资源。

当你使用标签列表加载资源时,可以指定是要加载列表中任何标签的所有资源,还是仅加载拥有列表中每个标签的资源。

例如,如果你使用 charactersanimals 标签加载资源,可以选择加载这两个资源集的并集(包括所有角色和所有动物),或者加载这两个资源集的交集(仅包括作为动物的角色)。有关更多信息,请参阅 Loading multiple assets

当你选择根据分配的标签使用组 Bundle Mode 设置打包组中的资源时,Addressables 构建脚本会为组中每个唯一的标签组合创建一个 bundle。例如,如果你有一个组中的资源被标记为 catdog,并且被标记为 smalllarge,构建会生成四个 bundles:一个用于小猫,一个用于小狗,一个用于大猫,另一个用于大狗。

管理标签

要创建和删除标签,请使用 Labels 窗口,可以从 Addressables Groups 窗口访问该窗口(路径:Window > Asset Management > Addressables > Groups > Tools > Windows > Labels)。

要创建新标签,选择列表底部的 + 按钮。输入新名称并点击 Save

要删除标签,在列表中选择它,然后选择 - 按钮。删除标签还会将其从所有资源中移除。

创建组模板

组模板定义 Unity 为新组创建的框架对象(schema objects)类型。Addressables 系统包含了 Packed Assets 模板,其中包含使用默认构建脚本构建和加载 Addressables 所需的所有设置。

如果你想创建自己的构建脚本或需要附加设置的实用工具,可以在自己的架构对象中定义这些设置并创建自己的组模板。以下说明描述了如何执行此操作:

  1. 使用 Project 面板导航到 Assets 文件夹中的所需位置。
  2. 创建一个空白组模板(菜单:Assets > Addressables > Group Templates > Blank Group Templates)。
  3. 为模板指定一个名称。
  4. Inspector 窗口中,根据需要添加描述。
  5. 点击 Add Schema 按钮,并从架构列表中选择。
  6. 重复这些步骤,以添加所需的多个新架构。
注意

如果使用默认构建脚本,组必须使用 Content Packing & Loading 架构。如果使用 Content Update Builds ,组必须包含 Content Update Restrictions 架构。有关更多信息,请参阅 Builds

将组打包到 AssetBundles 中

有关 bundle 模式的更多信息,请参阅 Advanced Group Settings

场景资源(Scene Assets)始终与组中的其他 Addressable 资源分开打包。因此,包含场景和非场景资源的组在构建时始终至少生成两个 bundle:一个用于场景,另一个用于其他资源。

当你选择将每个 Addressable 分别打包时,标记为 Addressable 的文件夹中的资源和复合资源(如 sprite sheets)会被特殊处理:

  • 标记为 Addressable 的文件夹中的所有资源会一起打包到同一个文件夹中(文件夹中单独标记为 Addressable 的资源除外)。
  • Addressable Sprite Atlas 中的 sprites 会包含在同一个 bundle 中。

有关更多信息,请参阅 Content Packing & Loading settings

AssetBundle 打包策略

选择将内容打包到少量大 bundle 中还是许多小 bundle 中,都可能在极端情况下产生后果:

太多 bundle 的风险:
  • 每个 bundle 都有内存开销。如果你预计一次性加载数百甚至数千个 bundle,这可能会占用大量内存。
  • 下载 bundle 有并发限制。如果你需要一次性下载数千个 bundle,它们不能同时下载。一些会先下载,完成后会触发更多的下载。在实践中,这是一个相对较小的问题,通常总下载大小会比 bundle 数量更为重要。
  • bundle 信息会膨胀目录。为了能够下载或加载目录,Unity 存储了关于 bundle 的字符串信息。数千个 bundle 的数据会大大增加目录的大小。
  • 重复资源的可能性更大。例如,如果你有两个标记为 Addressable 的材质,它们都依赖于相同的纹理。如果它们在同一个 bundle 中,纹理会被引用一次。如果它们在不同的 bundle 中,而纹理本身不是 Addressable,那么它会被重复。你需要将纹理标记为 Addressable、接受重复或者将材质放在同一个 bundle 中三选一。有关更多信息,请参阅 Asset and AssetBundle dependencies
太少 bundle 的风险:
  • UnityWebRequest(Unity 用于下载)不会恢复失败的下载。因此,如果一个大 bundle 正在下载,用户失去连接,重新连接后下载会重新开始
  • 可以单独从 bundle 中加载项目,但不能单独卸载。例如,如果你在一个 bundle 中有 10 个材质,加载了全部 10 个,然后告诉 Addressables 释放其中 9 个,所有 10 个可能都会保留在内存中。有关更多信息,请参阅 Memory management
项目规模扩大时的注意事项

随着项目规模的扩大,请注意以下资源和 bundle 方面的内容:

  • 总 bundle 大小:历史上 Unity 不支持超过 4GB 的文件。这在一些最新的编辑器版本中已修复,但仍可能存在问题。为保持跨所有平台的最佳兼容性,应将给定 bundle 的内容保持在此限制以下。
  • Bundle 依赖项 :加载 Addressable 资源时,所有的 bundle 依赖项也会被加载。在创建 Addressable 组时,请注意资源之间的引用。有关更多信息,请参阅 Asset and AssetBundle dependencies
  • 子资源影响 UI 性能 :虽然没有硬性限制,但如果你有很多资源,并且这些资源有许多子资源,最好禁用子资源显示。此选项只影响数据在 Groups 窗口中的显示方式,不影响你在运行时可以加载和不可以加载的内容。该选项在 Groups 窗口的 Tools > Show Sprite and Subobject Addresses 下可用。禁用此选项会使 UI 更加响应。
  • 组层次显示 :另一个仅影响 UI 的选项是 Group Hierarchy with Dashes。可以在顶层设置的检查器中找到此选项。启用此选项后,名称中包含破折号的组将显示为如果破折号代表文件夹层次结构。这不会影响实际的组名称或构建方式。例如,两个名为 x-y-zx-y-w 的组会显示为在一个名为 x 的文件夹中有一个名为 y 的文件夹。该文件夹中有两个组,分别名为 x-y-zx-y-w。这不会影响 UI 响应,只是使浏览大量组变得更容易。

【参考】Addressables Groups 窗口

使用 Addressables Groups 窗口管理你的组和 Addressable 资源。要打开该窗口,请转到Window > Asset Management > Addressables > Groups

Groups 窗口还作为启动内容构建并访问 Addressables 系统工具和设置的中心位置。

组是 Addressables 系统的主要组织单位。使用此窗口创建和管理组及其包含的资源。

组列表(Group list)

组列表显示项目中的 Addressable 组。展开列表中的组以显示其包含的资源。你还可以展开复合资源(如 sprite sheets)以显示它们包含的子对象。

首次安装 Addressables 包时,Groups 窗口显示两个资源组:

  • Default Local Group (Default) :最初为空,Unity 将任何你标记为 Addressable 的资源添加到此组中。该组设置为将其资源构建到本地构建路径并包含在项目构建中。你可以更改名称、设置,并根据需要将其他组设为默认组。默认组的设置也用于创建 shared AssetBundles

列表列包含以下信息:

描述
Notifications 在构建过程中标记的关于组或资源的任何通知。
Group Name \ Addressable Name 项目的名称。对于组,这是一个可以分配的任意名称。对于资源,这是 Addressable 地址。你可以使用上下文菜单编辑名称或地址。
Icon 基于资源类型的 Unity 资源图标。
Path 项目中源资源的路径。
Labels 显示分配给资源的任何标签。单击标签条目更改分配的标签或管理标签定义。

要对组列表中显示的资源进行排序,选择其中一个列标题。这会对每个组内的资源进行排序,但不会重新排序组。要更改组的显示顺序,将其拖动到所需位置。

Groups 窗口工具栏

Addressables Group 窗口顶部的工具栏提供以下设置:

设置 描述
New 选择模板以创建新组,或选择空白组(无架构)。有关创建自己的模板的信息,请参阅 Group templates
Profile 设置活跃的 Profile 以选择用于构建和加载 Addressables 的路径。选择现有配置文件或选择 Manage Profiles 打开 Profiles 窗口。
Tools 打开各种 Addressables 工具。选择以下之一:* Inspect System Settings:打开 Addressables 设置检查器。Check for Content Update Restrictions:运行预更新内容检查。有关更多信息,请参阅 Update RestrictionsWindow:打开其他 Addressables 系统窗口:ProfilesLabelsAddressables Report 窗口。Groups View:设置组窗口显示选项:Show Sprite and Subobject Addresses:启用以在组列表中显示 sprite 和子对象地址,或仅显示父对象。Group Hierarchy with Dashes:启用以显示名称中包含破折号的组,仿佛破折号表示组层次结构。例如,如果你将两个组命名为 x-y-zx-y-w,窗口会显示一个名为 x 的条目,其子条目为 y,其中包含两个组,分别为 x-y-zx-y-w。启用此选项仅影响组的显示。
Play Mode Script 设置活动的 Play Mode Script。活动的 Play Mode Script 确定在编辑器 Player 模式下如何加载 Addressables。有关更多信息,请参阅 Play Mode Scripts
Build 选择一个内容构建命令:* New Build:选择构建脚本以运行完整内容构建。Update a Previous Build:运行基于先前构建的差异更新。Clear Build Cache:选择命令以清除现有构建工件。有关更多信息,请参阅 Builds
Play Mode Scripts

活动的 Play Mode Script 确定当你在 Player 模式下运行游戏时,Addressable 系统如何访问 Addressable 资源。当你选择一个 Play Mode Script 时,它会一直保持为活跃脚本,直到你选择另一个。Play Mode Script 对你在 Unity 编辑器之外构建和运行应用程序时的资源加载没有影响

Play Mode Scripts 包括:

  • Use Asset Database:直接从编辑器资源数据库加载资源,编辑器资源数据库也用于所有非 Addressable 资源。使用此选项时不需要构建 Addressable 内容。
  • Use Existing Build:从先前内容构建创建的 bundles 中加载资源。使用此选项前必须使用构建脚本(如 Default Build Script)运行完整构建。远程内容必须托管在用于构建内容的配置文件的 RemoteLoadPath。
查找资源

要在 Groups 窗口中定位 Addressable 资源,在 Groups 窗口工具栏的过滤控件中输入其地址、路径或标签的全部或部分。

要在项目中定位资源,在 Groups 窗口中选择该资源。Unity 然后会在 Project 窗口中选择该资源,并在 Inspector 窗口中显示其详细信息。

组上下文菜单

右键点击组名称以打开组上下文菜单并访问与组相关的命令。

命令 描述
Remove Group(s) 移除组并删除其关联的ScriptableObject资源。Unity 将组中的任何资源恢复为非 Addressable 资源。
Simplify Addressable Names 通过删除路径样(path-like)组件和扩展名来缩短组中资源的名称。
Set as Default 将组设置为默认组。当你将资源标记为 Addressable 而未显式分配组时,Unity 会将资源添加到默认组。
Inspect Group Settings 在 Unity Project 窗口和 Inspector 窗口中选择组资源,以便查看设置。
Rename 编辑组的名称。
Create New Group 基于组模板创建新组。

资源上下文菜单

右键点击资源以打开 Addressable 资源上下文菜单并访问与资源相关的命令。

命令 描述
Move Addressables to Group 将选定资源移动到不同的现有组。
Move Addressables to New Group 创建一个新组,使用与当前组相同的设置,并将选定资源移动到其中。
Remove Addressables 从组中移除选定资源,并使资源变为非 Addressable。
Simplify Addressable Names 通过删除路径样组件和扩展名来缩短选定资源的名称。
Copy Address to Clipboard 将资源的分配地址字符串复制到系统剪贴板。
Change Address 编辑资源的名称。
Create New Group 基于组模板创建新组。这不会移动选定资源。

Group Settings 和 Schema 概述

组设置确定 Unity 在内容构建中如何处理组中的资源。组设置控制属性,例如 Unity 构建 AssetBundles 的位置或 bundle 压缩设置。

要打开组的设置,请打开 Addressables Groups 窗口(Window > Asset Management > Addressables > Groups),然后选择一个组。组的设置显示在 Inspector 窗口中。

组的设置在附加到组的架构对象(Schema objects)中声明。当你使用 Packed Assets 模板创建组时,Content Packing & Loading 和 Content Update Restriction 架构定义该组的设置。默认的 Build 脚本期望这些设置。

架构(Schemas)

Group Schema 是一个 ScriptableObject,定义了 Addressables 组的一组设置。你可以将任意数量的架构分配给一个组。Addressables 系统定义了一些供其自身使用的架构。你也可以创建自定义架构来支持自己的构建脚本和工具。

内置架构包括:

创建自定义架构(Schema)

要创建自己的架构,扩展 [AddressableAssetGroupSchema](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEditor.AddressableAssets.Settings.AddressableAssetGroupSchema.html) 类,这是一种 ScriptableObject:

cs 复制代码
using UnityEditor.AddressableAssets.Settings;

public class CustomSchema : AddressableAssetGroupSchema
{
   public string CustomDescription;
}

定义自定义架构对象后,可以使用这些实体的 Inspector 窗口中的 Add Schema 按钮将其添加到现有组和组模板中。

你可能还需要创建一个自定义 Unity 编辑器脚本,帮助用户与自定义设置进行交互。有关更多信息,请参阅 Custom Inspector scripts

在构建脚本中,可以使用 AddressableAssetGroup 对象访问组的架构设置。

【参考】内容打包与加载架构(Content Packing & Loading schema)

Content Packing & Loading 架构是默认构建脚本使用的主要 Addressables 架构,它定义了构建和加载 Addressable 资源的设置。

要打开 Content Packing & Loading 架构,请打开 Addressables Groups 窗口(Window > Asset Management > Addressables > Groups),然后选择一个组。组的设置显示在 Inspector 窗口中。

构建和加载路径

构建和加载路径设置确定内容构建的工件创建位置以及 Addressables 系统在运行时查找它们的位置。

属性 描述
Build & Load Paths 定义 Addressables 构建系统为此组创建 artifacts 的位置以及 Addressables 系统在运行时加载这些artifacts 的位置的配置文件路径(Profile path)对。可以从列表中选择路径对,或者选择 <custom> 单独设置构建和加载路径。
Build Path & Load Path 仅在将 Build & Load Paths 设置为 <custom> 时可用。定义 Addressables 构建系统为此组创建工件的位置的配置文件变量,或设置自定义字符串。使用以下之一:LocalBuildPath:用于计划作为应用安装的一部分分发的资源。RemoteBuildPath:用于计划使用远程托管服务(如 Unity Cloud Content Delivery 或其他内容交付网络(Content Delivery Network))分发的资源。Custom:指定一个字符串作为此组的路径。

构建和加载路径选项由配置文件(Profile)中的变量定义。请注意,仅应使用适用于特定目的的变量。例如,为构建路径选择加载路径变量不会给出有用的结果。

当你选择一个配置文件变量时,路径预览中会显示路径的预览。路径中的大括号部分(如 {UnityEngine.AddressableAssets.Addressable.RuntimePath})表示在运行时使用静态变量构建最终路径。Addressables 系统在运行时初始化时,用静态变量的当前值替换路径的这一部分。

高级选项
属性 描述
Asset Bundle Compression 组生成的所有 bundle 的压缩类型。LZ4 通常是最有效的选项,但在特定情况下其他选项可能更好。有关更多信息,请参阅 AssetBundle Compression
Include In Build 启用此属性以在内容构建(Content Build)中包含此组的资源。
Force Unique Provider 启用此属性以为此组使用资源提供者类的唯一实例。如果你为此组中的资源类型有自定义提供者实现,并且这些提供者的实例不能在组之间共享,请启用此选项。
Use Asset Bundle Cache 启用此属性以缓存远程分发的 bundle。
Asset Bundle CRC 启用此属性以在加载 bundle 之前验证其完整性。有关更多信息,请参阅 AssetBundle CRC:* Disabled:从不检查 bundle 完整性。Enabled, Including Cached:始终检查 bundle 完整性。Enabled, Excluding Cached:在下载时检查 bundle 的完整性。
Use UnityWebRequest for Local Asset Bundles 启用此属性以使用 ++[UnityWebRequestAssetBundle.GetAssetBundle](https://docs.unity3d.com/2023.1/Documentation/ScriptReference/Networking.UnityWebRequest.GetAssetBundle.html)++ 加载此组的本地 AssetBundle 档案,而不是 ++[AssetBundle.LoadFromFileAsync](https://docs.unity3d.com/2023.1/Documentation/ScriptReference/AssetBundle.LoadFromFileAsync.html)++。
Request Timeout 下载远程 bundle 的超时间隔。
Use Http Chunked Transfer(Deprecated) 启用此属性以在下载 bundle 时使用 HTTP/1.1 分块传输编码方法。在 Unity 2019.3 及更高版本中已弃用并忽略。
Http Redirect Limit 下载 bundle 时允许的重定向次数。
Retry Count 下载失败时重试的次数。
Include Addresses in Catalog 启用此属性以在目录中包含地址字符串。如果不使用地址字符串加载组中的资源,可以禁用此属性以减小目录大小。
Include GUIDs in Catalog 启用此属性以在目录中包含 GUID 字符串。必须包含 GUID 字符串以使用 AssetReference 访问资源。如果不使用 AssetReference 或 GUID 字符串加载组中的资源,可以禁用此属性以减小目录大小。
Include Labels in Catalog 启用此属性以在目录中包含标签字符串。如果不使用标签加载组中的资源,可以禁用此属性以减小目录大小。
Internal Asset Naming Mode 确定 AssetBundle 中资源的标识方式,并用于从 bundle 中加载资源。此值用作资源位置的 internalId。更改此设置会影响 bundle 的 CRC 和哈希值。警告:不要为 Content Update Builds (Content Update Builds)修改此设置,因为存储在内容状态文件中的数据将变得无效。不同模式包括: Full Path:资源在项目中的路径。在开发过程中推荐使用,因为如果需要,可以通过 ID 识别正在加载的资源。Filename:资源的文件名。这也可用于识别资源。注意:不能有多个具有相同名称的资源。GUID:资源的确定性值。Dynamic:基于组中资源构建的最短 ID。推荐在发布时使用,因为它可以减少 AssetBundle 和目录中的数据量,并降低运行时内存开销。
Internal Bundle Id Mode 确定 AssetBundle 在内部的标识方式。这会影响 AssetBundle 定位包含在其他 bundle 中的依赖项的方式。更改此值会影响此 bundle 和引用它的所有其他 bundle 的 CRC 和哈希。警告:不要为 Content Update Builds (Content Update Builds)修改此设置,因为存储在内容状态文件(content state file)中的数据将变得无效。不同模式包括:Group Guid:组的唯一标识符。推荐使用此模式,因为它不会更改。Group Guid Project Id Hash:使用组 GUID 和 Cloud Project ID 的组合(如果启用了 Cloud Services)。如果项目绑定到不同的 Cloud Project ID,此模式会更改。共享多个项目之间的资源时,推荐使用此模式,因为构建的 ID 在项目之间是确定性和唯一的。Group Guid Project Id Entries Hash:使用组 GUID、Cloud Project ID(如果启用了 Cloud Services)和组中的资源条目的组合。使用此模式可能会导致 bundle 缓存版本问题。添加或删除条目会导致不同的哈希。
Cache Clear Behavior 确定安装的应用何时从缓存中清除 AssetBundles。
Bundle Mode 设置如何将组中的资源打包到 bundle 中:Pack Together:创建包含所有资源的单个 bundle。Pack Separately:为组中的每个主资源创建一个 bundle。子资源(如 sprite sheet 中的 sprites)一起打包。添加到组中的文件夹内的资源也会一起打包。Pack Together by Label:为共享相同标签组合的资源创建一个 bundle。
Bundle Naming Mode 设置如何构建 AssetBundles 的文件名:* Filename:文件名是从组名派生的字符串。不附加哈希。Append Hash to Filename:文件名是从组名派生的字符串,附加 bundle 哈希。bundle 哈希根据 bundle 的内容计算。Use Hash of AssetBundle:文件名是 bundle 哈希。Use Hash of Filename:文件名是根据从组名派生的字符串计算的哈希。
Asset Load Mode 设置是按请求单独加载资源(默认)还是总是一起加载组中的所有资源。大多数情况下推荐使用 Requested Asset and Dependencies。有关更多信息,请参阅 Asset Load Mode
Asset Provider 定义 Addressables 使用哪个 Provider class 从此组生成的 AssetBundles 中加载资源。除非你有自定义 Provider 实现来从 AssetBundle 提供资源,否则将此选项设置为 Assets from Bundles Provider
Asset Bundle Provider 定义 Addressables 使用哪个 Provider 类加载此组生成的 AssetBundles。除非你有自定义 Provider 实现来提供 AssetBundles,否则将此选项设置为 AssetBundle Provider
AssetBundle 压缩

Addressables 提供三种不同的 bundle 压缩选项:

  • 未压缩(Uncompressed) :这种选项在磁盘上占用空间最大,但加载速度最快。如果你的应用有足够的空间,可以考虑将本地内容使用此选项。未压缩 bundle 的一个优点是它们处理补丁的方式更为准确(最小的补丁)。其他压缩选项会导致补丁的一些膨胀。
  • LZ4:如果未压缩不是一个可行的选项,那么所有其他本地内容应使用 LZ4。这是一种基于块的压缩方式,允许在不加载整个文件的情况下加载文件的一部分。
  • LZMA:将 LZMA 用于所有远程内容,而不是本地内容。它提供最小的 bundle 大小,但加载速度最慢。如果你将本地 bundle 存储为 LZMA,可以创建更小的 Player ,但加载时间明显比未压缩或 LZ4 更糟。对于下载的 bundle,LZMA 通过在将其存储到 AssetBundle 缓存时重新压缩下载的 bundle 来避免加载缓慢。默认情况下,bundle 使用 LZ4 压缩存储在缓存中。

要设置压缩,请使用每个组的高级设置。压缩不会影响加载内容的内存大小。

平台的硬件特性意味着未压缩的 bundle 并不总是加载最快。加载未压缩 bundle 的最大速度受 IO 速度限制,而加载 LZ4 压缩 bundle 的速度取决于 IO 速度或 CPU,具体取决于硬件。

在大多数平台上,加载 LZ4 压缩 bundle 受 CPU 限制,而加载未压缩的 bundle 更快。在 IO 速度低、CPU 速度高的平台上,LZ4 加载可能更快。最佳实践是运行性能分析以验证你的游戏是否符合常见模式,或需要一些独特的调整。

有关 Unity 压缩选择的更多信息,请参阅 AssetBundle compression manual page

AssetBundle CRC

根据不同情况,使用不同的 CRC 设置效果最佳。检查文件变化需要解压整个 AssetBundle,并在解压后的字节上进行检查,这可能会对性能产生负面影响。

错误(corruption)很可能只会在下载期间发生,因为磁盘存储通常是可靠的,保存到磁盘后文件不太可能损坏。如果你的 AssetBundle 包含可能被篡改的数据(例如设置值),则可以考虑启用对已保存 AssetBundles 的 CRC 检查。

对于本地 AssetBundles,如果应用程序下载在保存到磁盘之前执行检查,请考虑将此属性设置为禁用,因为下载已经被检查过了。

对于远程 AssetBundles,启用但不包括缓存是一个不错的默认设置。当下载并缓存 AssetBundle 到磁盘时,在保存文件时会进行字节解压和 CRC 计算。这不会影响性能,并且最有可能在下载阶段发生 corruption 。 包括缓存的设置适用于需要每次检查数据的情况,例如设置值。

资源加载模式

对于大多数平台和内容集合,应使用 Requested Asset and Dependencies。这种模式仅加载通过 [LoadAssetAsync](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.Addressables.LoadAssetAsync.html) or LoadAssetsAsync 请求的资源。对象按它们在 bundle 文件中出现的顺序加载,这可能会导致多次读取同一文件。启用 Addressables Build settings 中的 Contiguous Bundles 选项有助于减少额外文件读取的次数。

Requested Asset and Dependencies这种模式防止了将未使用的资源加载到内存中的情况。

在加载界面等情况下,你需要一起加载所有打包的资源。对于大多数类型的内容,使用 Requested Asset and Dependencies 模式加载各个资源的性能相似或更好。这种模式按顺序读取整个 bundle 文件,在某些平台上可能更可取。

加载性能可能会因内容类型而异。例如,具有直接引用其他序列化数据的大量序列化数据(如 prefabs 或 ScriptableObjects)使用 All Packed Assets and Dependencies 加载速度更快。对于某些其他资源(如纹理),单独加载每个资源通常能获得更好的性能。

如果使用 Synchronous Addressables ,资源加载模式之间的性能差异很小。由于更大的灵活性,你应在知道内容将同步加载的情况下使用 Requested Asset and Dependencies

在使用 All Packed Assets and Dependencies 加载第一个资源时,所有资源都会加载到内存中。稍后的 LoadAssetAsync 调用会返回预加载的资源,而不需要再次加载它。

即使使用 All Packed Assets and Dependencies 选项将组中的所有资源和任何依赖项加载到内存中,但只有明确加载的资源(或明确加载的资源的依赖项)的引用计数才会增加。如果稍后调用 Resources.UnloadUnusedAssets 或使用 LoadSceneMode.Single 加载新场景,则任何未使用的资源(引用计数为零的资源)将被卸载。

【参考】内容更新限制架构(Content Update Restriction schema)

内容更新限制架构决定 Check for Content Update Restrictions 工具如何处理组中的资源。要为差异 Content Update Builds 而不是完整内容构建准备组,在 Addressables Groups window 中,转到 Tools 并运行Check for Content Update Restrictions命令。该工具会将任何启用了Prevent Updates属性的组中的修改过的资源移动到一个新组中。

Prevent Updates 属性的作用方式:

  • 启用:工具不会移动任何资源。当你进行更新构建时,如果 bundle 中的任何资源发生了变化,则整个 bundle 会被重建。
  • 禁用 :如果 bundle 中的任何资源发生了变化,则 Check for Content Update Restrictions 工具会将它们移动到为更新创建的新组中。当你进行更新构建时,从这个新组创建的 AssetBundles 中的资源将覆盖现有 bundle 中的版本。

有关更多信息,请参阅 Content Update Builds

Profile

【概述】Profile

一个配置文件包含一组 Addressables 构建脚本使用的变量。这些变量定义了诸如在哪里保存构建 artifacts 以及在运行时从哪里加载数据等信息。你可以添加自定义配置变量以用于自己的构建脚本。

要管理项目中的配置文件,请使用 Addressables Profiles 窗口(菜单:Window > Asset Management > Addressables > Profiles)。

你可以为开发过程中不同的阶段或任务设置不同的配置文件。例如,你可以创建一个用于开发项目的配置文件,另一个用于测试的配置文件,以及一个用于最终发布的配置文件。预先设置配置文件并在它们之间切换是最佳实践,而不是在进入不同阶段或执行不同任务时单独编辑值。

配置示例

考虑以下示例,它展示了内容本地开发阶段的情况:

在开发过程中,你会将本地和远程 bundle 都使用本地路径:

在这种情况下,本地和远程路径实际上都是本地的,这使得不需要为本地开发设置远程服务器。

一旦内容准备好生产,你可以将远程 bundle 移动到服务器:

在这种情况下,如果你使用配置文件,可以将生产环境的远程加载路径更改为该服务器。无需更改资源组,你就可以将所有远程 bundle 更改为远程。

Addressables 系统仅在 Player 构建期间将数据从Addressables.BuildPath复制到StreamingAssets文件夹。它不处理通过 LocalBuildPathLocalLoadPath 变量指定的任意路径。如果你将数据构建到默认位置以外的位置或从默认位置以外的位置加载数据,则必须手动复制数据。

同样,你必须手动将 Remote AssetBundles 以及相关的 catalog 和 hash 文件上传到服务器,以便它们可以通过 RemoteLoadPath 定义的 URL 进行访问。

创建配置文件

要创建一个新配置文件,请打开 Addressables Profile 窗口,选择 Create > Profile。表中会出现一个新的配置文件行。

每个配置文件必须为每个变量定义一个值。当你创建一个新配置文件时,Addressables 会从所选配置文件中复制所有值。

设置活跃配置文件

活动配置文件决定了运行构建脚本时使用的变量集。

要设置活动配置文件,可以通过以下方法之一:

  1. 打开 Groups 窗口(菜单:Window > Asset Management > Addressables > Groups)。
  2. 点击工具栏中的 Profile 菜单。
  3. 选择要设为活动的配置文件。

或者:

  1. 打开 Profiles 窗口(菜单:Window > Asset Management > Addressables > Profiles)。
  2. 右键点击一个配置文件以打开上下文菜单。
  3. 选择 Set Active

配置变量概述

配置变量是通用的键/值组合,可以用于根据不同的开发情况更改 Addressables 配置。

有两种类型的配置变量:

  • 标准变量(Standard):独立的键/值对
  • 路径对(Path pairs):使用特殊命名约定将一组变量连接在一起。

路径对通常用于在不同开发情况下更改不同的构建和加载路径。例如,你可能使用路径对来更改各个平台的 Addressable 内容的构建和加载路径。

添加新的标准变量(standard variable)

你可以将两种变量添加到配置文件中:

  • 变量(Variable):定义单一值的基本变量
  • 构建和加载路径变量(Build and Load Path Variable):定义两组路径值的路径对。一个值用于构建路径,另一个值用于加载路径

要添加新的配置变量,请打开 Addressables Profiles 窗口,打开 Create 菜单并选择 Variable 或 Build Load Path Variable。为新变量分配一个名称和值,然后选择 Save 。Addressables 会将新变量添加到所有配置文件中。右键点击变量名称可重命名或删除该变量。

你可以将基本变量作为路径值的组件(例如 BuildTarget),并且可以在自己的构建脚本中使用它们。使用路径对变量来设置组和 Remote Catalog 的 Build & Load Paths 设置。

路径对(Path Pairs)

路径对定义了一组匹配的 BuildPath 和 LoadPath 变量。当你创建路径对时,可以使用该对名称作为一个单位分配组或 Remote Catalog 的路径设置。

要创建路径对,请转到 Create 并选择 Build Load Path Variables。为路径对分配一个前缀名称,并为各个字段分配路径字符串。

新的路径对使用初始值的 Custom 设置作为 Bundle Location 属性。如果需要,可以更改为其他 Bundle Location。

你可以通过在 Profile 窗口中重命名构建和加载路径的两个常规变量,将它们转换为路径对。将其中一个设置为 VariableName.BuildPath,另一个设置为 VariableName.LoadPath。

Addressables Profiles 窗口显示了两个具有两个路径对的配置文件。

默认路径值

构建和加载路径的默认值是:

  • 本地构建路径(Local build path)[UnityEditor.EditorUserBuildSettings.activeBuildTarget]
  • 本地加载路径(Local load path)[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]
  • 远程构建路径(Remote build path)ServerData/[BuildTarget]
  • 远程加载路径(Remote load path):通常不需要更改本地路径值。Unity 构建系统期望 AssetBundles 和其他文件存在于默认位置。如果更改本地路径,则必须在创建 Player 构建之前将文件从构建路径复制到加载路径。加载路径必须始终位于 Unity StreamingAssets 文件夹内。

如果远程分发内容,必须更改远程加载路径以反映托管远程内容的 URL。可以将远程构建路径设置为任何方便的位置:构建系统不依赖于默认值。

配置变量语法(Profile variable syntax)

所有配置变量都是字符串类型。你可以为它们分配固定路径或值。你还可以使用两种语法表示法从静态属性或其他变量派生全部或部分变量的值:

  • 方括号 [ ] :Addressables 在构建时评估方括号中的条目。条目可以是其他配置变量(例如 BuildTarget),也可以是代码变量(例如 UnityEditor.EditorUserBuildSettings.activeBuildTarget)。在构建过程中,当 Addressables 处理组时,它会评估方括号内的字符串,并将结果写入目录中。
  • 大括号 { } :Addressables 在运行时评估大括号中的条目。你可以使用运行时类的代码变量,例如 {UnityEngine.AddressableAssets.Addressables.RuntimePath}

可以在方括号或大括号内使用静态字段和属性。名称必须完全限定,并且类型必须在上下文中有效。例如,UnityEditor 命名空间中的类不能在运行时使用。

默认配置变量设置中使用的代码变量包括:

  • [UnityEditor.EditorUserBuildSettings.activeBuildTarget]
  • [UnityEngine.AddressableAssets.Addressables.BuildPath]
  • [UnityEngine.AddressableAssets.Addressables.RuntimePath]

例如,将 {MyNamespace.MyClass.MyURL}/content/[BuildTarget] 的加载路径设置为创建名为 trees.bundle 的 AssetBundle 的组。在构建期间,目录会将该 bundle 的加载路径注册为{MyNamespace.MyClass.MyURL}/content/Android/trees.bundle,评估 [BuildTarget] 为 Android,并将 AssetBundle 名称添加到路径中。在运行时,当 Addressables 系统处理目录时,它会评估 {MyNamespace.MyClass.MyURL} 以生成最终的加载路径,例如 http://example.com/content/Android/trees.bundle

设置构建和加载路径

在配置文件中设置必要的变量后,可以根据指定的变量为资源组选择构建和加载路径。

设置构建和加载路径的方法:

  1. 从 Project 窗口中选择一个 Addressable 资源组。
  2. 在该组的 Inspector 窗口中,找到 Content Packing & Loading > Build and Load Paths,然后选择所需的路径对。如果选择 <custom> 选项,可以分别指定构建和加载路径。

你需要选择一个代表在 Profiles 窗口中定义的路径的变量,而不是直接输入路径。Path Preview 显示基于 active profile 文件的当前路径。要直接编辑路径,请在组设置的 Inspector 中将 Build & Load Paths 设置为 <custom>,并将单独的 Build PathLoad Path 设置为 <custom>。编辑的路径仅适用于该组。

【参考】Addressables 配置窗口

要管理项目中的配置文件,请使用 Addressables Profiles 窗口(菜单:Window > Asset Management > Addressables > Profiles)。

右键点击配置文件名称可以设置为活动配置文件、重命名配置文件或删除配置文件。

以下是可用的默认配置文件变量:

配置文件变量描述:

配置文件 描述
Local 设置本地内容的变量。你可以选择:Built-In Cloud Content Delivery Custom
Local.BuildPath 仅当你选择 Custom 作为变量时可编辑,定义包含你希望随应用程序本地安装的资源的文件的构建位置。默认情况下,此路径在项目库文件夹内。
Local.LoadPath 仅当你选择 Custom 作为变量时可编辑,定义随应用程序本地安装的资源的加载位置。默认情况下,此路径在 StreamingAssets 文件夹中。构建 Player 时,Addressables 会自动包括构建到 StreamingAssets 默认位置的本地内容,但不会包括其他位置的内容。
Remote 设置远程内容的变量。你可以选择:Built-In Cloud Content Delivery Custom
Remote.BuildPath 仅当你选择 Custom 作为变量时可编辑,定义包含你计划远程分发的资源的文件的构建位置。
Remote.LoadPath 仅当你选择 Custom 作为变量时可编辑,定义从中下载远程内容和目录的 URL。
BuildTarget 设置构建目标的名称,例如 Android 或 StandaloneWindows64。

通常,你不需要更改本地构建或加载路径的默认值。如果确实需要更改,必须在创建 Player 构建之前将本地构建工件从自定义构建位置手动复制到项目的 StreamingAssets 文件夹。更改这些路径还排除了将 Addressables 作为 Player 构建的一部分进行构建的可能性。

有关更多信息,请参阅构建,了解 Addressables 如何在内容构建期间使用配置文件。

Asset Reference

【概述】资源引用(Asset reference)

AssetReference 是一种可以引用 Addressable 资源的类型。

MonoBehaviourScriptableObject 中使用 AssetReference 类。当你向这些类之一添加一个可序列化的 AssetReference 字段时,可以在 Inspector 窗口中为该字段分配值。你可以按类型和标签限制可以分配给字段的资源。

要分配值,可以将资源拖到字段中,或选择对象选择器图标以打开对话框,从中选择一个 Addressable 资源。

如果将一个非 Addressable 资源拖到 AssetReference 字段中,系统会自动将该资源设置为 Addressable 并将其添加到默认的 Addressables 组。Sprite 和 SpriteAtlas 资源可以包含子对象。分配了这些类型资源的 AssetReference 会显示一个额外的对象选择器,可以用来指定引用的子对象。

有关在项目中使用 AssetReference 类型的示例,请参考 Addressables-Sample 仓库中的 Basic AssetReference, Component ReferenceSprite Land 项目。

资源引用类型

Addressables API 提供了常见类型资源的 ++[AssetReference](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.AssetReference.html)++ 子类。你可以使用通用子类 [AssetReferenceT<TObject>](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.AssetReferenceT-1.html) 来限制 AssetReference 字段到其他资源类型。

资源引用类型包括:

AssetReference 类型 描述
AssetReference 可以引用任何资源类型
AssetReferenceT<TObject> 可以引用与 TObject 类型相同的资源
AssetReferenceTexture 可以引用一个 Texture 资源
AssetReferenceTexture2D 可以引用一个 Texture2D 资源
AssetReferenceTexture3D 可以引用一个 Texture3D 资源
AssetReferenceGameObject 可以引用一个 Prefab 资源
AssetReferenceAtlasedSprite 可以引用一个 SpriteAtlas 资源
AssetReferenceSprite 可以引用一个单一 Sprite 资源

创建资源引用

要将 AssetReference 或其子类添加到 MonoBehaviourScriptableObject 中,请在类中将其声明为可序列化字段:

cs 复制代码
using System;
using UnityEngine;
using UnityEngine.AddressableAssets;

internal class DeclaringReferences : MonoBehaviour
{
    // 任意资源类型
    public AssetReference reference;

    // Prefab 资源
    public AssetReferenceGameObject gameObjectReference;

    // Sprite 资源类型
    public AssetReferenceSprite spriteReference;
    public AssetReferenceAtlasedSprite atlasSpriteReference;

    // 纹理资源类型
    public AssetReferenceTexture textureReference;
    public AssetReferenceTexture2D texture2DReference;
    public AssetReferenceTexture3D texture3DReference;

    // 指定标签的任意资源类型
    [AssetReferenceUILabelRestriction("animals", "characters")]
    public AssetReference labelRestrictedReference;

    // 通用资源类型 (Unity 2020.3+)
    public AssetReferenceT<AudioClip> typedReference;

    // 自定义资源引用类
    public AssetReferenceMaterial materialReference;

    [Serializable]
    public class AssetReferenceMaterial : AssetReferenceT<Material>
    {
        public AssetReferenceMaterial(string guid) : base(guid)
        {
        }
    }

    private void Start()
    {
        // 加载资源...
    }

    private void OnDestroy()
    {
        // 释放资源...
    }
}
加载和释放资源引用

AssetReference 类提供了自己的方法来加载、实例化和释放引用的资源。你还可以使用 AssetReference 实例作为键来调用任何加载资源的 Addressables 类方法。

以下示例将 AssetReference 实例化为当前 GameObject 的子对象,并在父对象销毁时释放它:

cs 复制代码
using UnityEngine;
using UnityEngine.AddressableAssets;

internal class InstantiateReference : MonoBehaviour
{
    [SerializeField]
    private AssetReferenceGameObject reference;

    void Start()
    {
        if (reference != null)
            reference.InstantiateAsync(this.transform);
    }

    private void OnDestroy()
    {
        if (reference != null && reference.IsValid())
            reference.ReleaseAsset();
    }
}

有关使用 AssetReference 加载资源的更多信息和示例,请参阅 加载 AssetReference

使用标签和资源引用

使用 AssetReferenceUILabelRestriction 属性可以将可分配给 AssetReference 字段的资源限制为具有特定标签的资源。可以使用此属性引用和 AssetReference 子类来按类型和标签限制分配。

以下示例防止将不具有 animalscharacters 标签的 Addressable 资源分配给引用:

cs 复制代码
[AssetReferenceUILabelRestriction("animals", "characters")]
public AssetReference labelRestrictedReference;

此属性仅阻止使用 Unity Editor 中的 Inspector 分配没有指定标签的资源。你仍然可以使用脚本将没有标签的资源分配给该字段。

你不能将非 Addressable 资源拖动到具有 AssetReferenceUILabelRestriction 属性的字段中。

创建具体子类

要创建具体子类,请继承 AssetReferenceT 类并指定资源类型。还必须将 GUID 字符串传递给基类构造函数:

cs 复制代码
[Serializable]
internal class AssetReferenceMaterial : AssetReferenceT<Material>
{
    public AssetReferenceMaterial(string guid) : base(guid)
    {
    }
}

你可以在另一个脚本中像使用其他 AssetReference 类型一样使用自定义 AssetReference 子类:

cs 复制代码
// 自定义资源引用类
public AssetReferenceMaterial materialReference;

【参考】Addressable Asset Settings

要管理项目中 Addressable 资源的工作方式,请使用 Addressable Asset Settings Inspector。打开此 Inspector,请转到 Window > Asset Management > Addressables > Settings。

Addressables 系统将设置资源存储在项目的 Assets 文件夹中的 AddressableSettingsData 文件夹中。如果该文件夹尚不存在,则必须从 Groups window 初始化 Addressables 系统(菜单:Window > Asset Management > Addressables > Groups)。

Profile

属性 描述
Profile In Use 选择活跃·配置文件,它决定了 Addressables 构建脚本使用的变量值。有关详细信息,请参阅 Profiles 文档。
Manage Profiles 打开 Profiles 窗口

Diagnostics

属性 描述
Log Runtime Exceptions 启用此属性以记录资源加载操作的运行时异常并将错误记录到 [AsyncOperationHandle.OperationException](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle.OperationException.html#UnityEngine_ResourceManagement_AsyncOperations_AsyncOperationHandle_OperationException) 属性中。

默认情况下,Addressable Assets 仅记录警告和错误。要启用详细日志记录,请打开 Player 设置窗口(菜单:Edit > Project Settings > Player),转到 Other Settings > Configuration 部分,并将 ADDRESSABLES_LOG_ALL 添加到 Scripting Define Symbols 字段中。

Catalog

属性 描述
Player Version Override 覆盖用于创建 Remote Catalog 名称的时间戳。如果设置, Remote Catalog 名为 Catalog_<Player Version Override>.json。如果留空,Unity 使用时间戳。
Compress Local Catalog 启用此属性以在压缩的 AssetBundle 文件中构建目录。此属性减少了目录的存储大小,但增加了构建和加载目录的时间。
Build Remote Catalog 启用此属性以创建内容目录的副本以存储在远程服务器上。启用此属性后,可用以下选项:
Build & Load Paths 设置 Remote Catalog 的构建和加载路径。从列表中选择 Profile 路径对,或选择 <custom> 以单独设置构建和加载路径。
Build Path 仅在将 Build & Load Paths 设置为 <custom> 时显示。设置 Remote Catalog 的构建位置。通常应使用 RemoteBuildPath 配置变量。
Load Path 仅在将 Build & Load Paths 设置为 <custom> 时显示。设置访问 Remote Catalog 的 URL。通常应使用 RemoteLoadPath 配置变量。
Only update catalogs manually 启用此属性以在运行时初始化 Addressables 系统时禁用自动检查更新的 Remote Catalog 。可以手动检查更新目录。

Update a Previous Build

要使用 Update a Previous Build 部分的属性,必须启用 Build Remote Catalog 属性。

属性 描述
Check for Update Issues 选择是否在更新中执行内容更新限制( content update restriction ),以及如何处理结果。
Content State Build Path 设置构建默认构建脚本生成的内容状态文件的位置。

Downloads

属性 描述
Custom certificate handler 设置用于自定义证书处理的类。列表中包含项目中所有扩展 UnityEngine.Networking.CertificateHandler 的类。
Max Concurrent Web Requests 设置最大并发 Web 请求数量。超出此限制的请求将排队。建议设置为 2 到 4 个并发下载以达到最佳下载速度。
Catalog Download Timeout 设置下载目录文件的等待秒数。如果设置为 0,则没有超时。

Build

属性 描述
Build Addressables on Player Build 选择 Unity 在构建 Player 时如何构建 Addressables 内容。此属性会覆盖当前项目的全局首选项,影响所有构建项目的贡献者。否则,全局首选项值适用于所有 Unity 项目。有关详细信息,请参阅 Building content
Build Addressables content on Player Build 构建 Player 时始终构建 Addressables 内容。
Do not Build Addressables content on Player Build 构建 Player 时从不构建 Addressables 内容。如果修改了 Addressables 内容,则必须在构建 Player 之前手动重建。
Use global Settings (stored in preferences) 使用 Unity Editor 首选项下 Addressables 中指定的值。
Ignore Invalid/Unsupported Files in Build 启用此属性以从构建脚本中排除无效或不支持的文件,而不是中止构建。
Unique Bundle IDs 启用此属性以在每次构建中为 bundle 生成唯一名称。有关详细信息,请参阅 Unique Bundle IDs。
Contiguous Bundles 启用此属性以生成更高效的 bundle 布局。如果有由 Addressables 1.12.1 或更早版本生成的 bundle,请禁用此属性以最小化 bundle 变化。
Non-Recursive Dependency Calculation 启用此属性以提高构建时间并减少具有循环依赖关系的资源的运行时内存开销。例如,将一个 prefab 分配到 Bundle A 中,并引用分配到 Bundle B 中的材质。禁用此属性时,Unity 需要为每个 bundle 计算材质的依赖关系。如果启用此选项,Unity 只需为 Bundle B 计算一次材质的依赖关系。
Strip Unity Version From AssetBundles 启用此属性以从 bundle 头中删除 Unity 版本。
Disable Visible Sub Asset Representations 启用此属性以提高构建时间(如果不直接使用子对象,如 sprites 或子网格)。
Shared Bundle Settings 确定用于共享 bundle(Monoscript 和 UnityBuiltInAssets)的组的设置。默认情况下为默认组。
Shared Bundle Settings Group 用于共享 bundle(Monoscript 和 UnityBuiltInAssets)的组的设置。
Built In Bundle Naming Prefix 选择如何命名为 Unity 内置资源生成的 bundle。
MonoScript Bundle Naming Prefix 选择如何命名包含所有 MonoScripts 的 bundle。此 bundle 确保在任何 MonoBehaviours 可以引用它们之前,Unity 加载所有 MonoScripts。还减少了重复或复杂的 MonoScript 依赖关系,从而减少了运行时内存开销。

Build and Play Mode Scripts

配置项目中可用的 IDataBuilder 脚本。如果创建自定义 Build 或 Play 模式脚本,则必须将其添加到此列表中才能使用。

Addressables 包含一些默认构建脚本,处理默认构建过程并提供在 Play 模式下访问数据的不同方式。可以在 AddressableAssetData/DataBuilders 文件夹中找到这些脚本。

构建和 Play 模式脚本是 ScriptableObject 资源。要为构建或 Play 模式脚本创建 ScriptableObject 资源,请按照 ScriptableObject 手册页面中的说明进行操作。

要添加自定义脚本,选择+按钮,然后从文件面板中选择代表所需脚本的ScriptableObject资源。

有关自定义脚本的更多信息,请参阅 Custom Build Scripting

Asset Group Templates

定义可用于创建新组的模板列表。创建新模板时,必须将其添加到此列表中才能使用。

Addressables 包含一个模板,包含默认构建脚本使用的架构。可以在 AddressableAssetData/AssetGroupTemplates 文件夹中找到该模板。

组模板是 ScriptableObject 资源。要为组模板创建 ScriptableObject 资源,请按照 ScriptableObject 手册页面中的说明进行操作。

要添加自定义模板,选择+按钮,然后从文件面板中选择代表所需模板的 ScriptableObject 资源。

有关创建自定义模板的信息,请参阅 Group templates

Initialization object list

配置项目的初始化对象。初始化对象是实现 IObjectInitializationDataProvider 接口的 ScriptableObject 类。可以创建这些对象以在运行时将数据传递到 Addressables 初始化过程。

初始化对象是 ScriptableObject 资源。要为初始化对象创建 ScriptableObject 资源,请按照 ScriptableObject 手册页面中的说明进行操作。

要添加初始化对象,选择+按钮,然后从文件面板中选择代表所需对象的 ScriptableObject 资源。

有关更多信息,请参阅 Customizing initialization

【参考】Addressables Preferences

Addressables 包在 Unity 编辑器的 Preferences 窗口中增加了自己的部分(File > Settings > Preferences > Addressables)。Addressables 的首选项包括:

首选项 描述
Debug Build Layout 启用此首选项以使构建系统生成构建布局报告(build layout report)。默认情况下,此首选项处于禁用状态,因为它会增加创建构建所需的时间。构建报告包含构建生成的每个 AssetBundle 的详细描述。有关此工具和其他分析工具的描述,请参阅 Diagnostic tools
Build Addressables on Player Build(仅在 Unity 2021.2+ 可用) 选择 Unity 是否在构建 Player 时构建 Addressables 内容。将 Addressables 内容与 Player 一起构建可能很方便,但会增加构建时间,特别是在大型项目中,因为即使没有修改任何资源,这也会重新构建 Addressables 内容。如果在大多数构建之间没有更改 Addressables 内容,则选择 "Do not Build Addressables content on Player Build" 模式。选项包括:Build Addressables content on Player Build:构建 Player 时始终构建 Addressables 内容。Do not Build Addressables content on Player Build:构建 Player 时从不构建 Addressables 内容。如果修改了 Addressables 内容,则必须在构建 Player 之前手动重建。这些首选项会覆盖当前项目的全局首选项,并影响所有构建项目的贡献者。
相关推荐
zaizai100722 分钟前
编辑器拓展(入门与实践)
unity
快快小毛毛1 小时前
CC攻击防御策略要怎么调整?使用游戏盾有效解决
运维·服务器·网络·tcp/ip·游戏·udp
闲人编程1 小时前
Python实现 Socket.IO 的在线游戏场景
开发语言·python·游戏·网络编程·io·socket·异步
GIS数据转换器2 小时前
跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例
大数据·数据库·人工智能·游戏·gis·智慧城市
YYDS3142 小时前
C++战列舰小游戏Lv. 1.4版本(半成品)
开发语言·数据库·c++·算法·游戏·游戏程序
hawkol2 小时前
如何打造一款成功的游戏
游戏
VMOS云手机2 小时前
《仙境传说RO:新启航》辅助攻略:VMOS云手机助力黄金虫打法技巧!挂机技巧大全!
游戏·云手机·游戏辅助·黑科技·免费云手机
躺下睡觉~3 小时前
Unity-Transform-坐标转换
linux·unity·游戏引擎
△曉風殘月〆3 小时前
.Net Gacutil工具(全局程序集缓存工具)使用教程
c#·.net·gac·gacutil
时光追逐者3 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)
microsoft·c#·.net·.netcore