Unity Addressables 使用说明(二)管理 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)。
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 窗口显示工具栏和组及资源列表

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 Restrictions。 Window:打开其他 Addressables 系统窗口:Profiles 、Labels 或 Addressables 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 窗口工具栏的过滤控件中输入其地址、路径或标签的全部或部分。
Filtering the group list by the string "NP" to find all assets labeled NPC

要在项目中定位资源,在 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 脚本期望这些设置。
The Inspector window for the Default Local Group

架构(Schemas)

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

内置架构包括:

  • Content Packing & Loading:默认构建脚本使用的主要 Addressables 架构,定义构建和加载 Addressable 资源的设置。有关此架构设置的信息,请参阅 Content Packing & Loading schema reference。
  • Content Update Restrictions:定义进行早期构建的差异更新的设置。有关此架构的更多信息,请参阅 Content Update Restriction schema reference。
创建自定义架构(Schema)

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

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 系统在运行时查找它们的位置。
Building and loading paths

属性描述
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 系统在运行时初始化时,用静态变量的当前值替换路径的这一部分。

高级选项

The Advanced Options section

属性描述
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 移动到服务器:
用于生产的远程 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 窗口中为该字段分配值。你可以按类型和标签限制可以分配给字段的资源。
Inspector 窗口显示了多个 AssetReference 字段

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

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

有关在项目中使用 AssetReference 类型的示例,请参考 Addressables-Sample 仓库中的 Basic AssetReference, Component Reference 和 Sprite 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 中,请在类中将其声明为可序列化字段:

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 的子对象,并在父对象销毁时释放它:

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 资源分配给引用:

[AssetReferenceUILabelRestriction("animals", "characters")]
public AssetReference labelRestrictedReference;

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

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

创建具体子类

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

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

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

// 自定义资源引用类
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)。
Addressable Asset Settings Inspector

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 之前手动重建。这些首选项会覆盖当前项目的全局首选项,并影响所有构建项目的贡献者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF推荐A类会议和期刊总结(计算机网络领域)- 2022

CCF推荐A类会议和期刊总结&#xff08;计算机网络领域&#xff09;- 2022 在中国计算机学会&#xff08;CCF&#xff09;的推荐体系中&#xff0c;A类会议和期刊代表着计算机网络领域的顶尖水平。这些会议和期刊不仅汇集了全球顶尖的研究成果&#xff0c;还引领着该领域的前沿发…

Python操作ES集群API(增删改查等)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 学习B站博主教程笔记&#xff1a; 最新版适合自学的ElasticStack全套视频&#xff08;Elk零基础入门到精通教程&#xff09;Linux运维必备—Elastic…

【信号】信号的保存

信号的保存 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.注意,阻塞和…

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4040 标注数量(xml文件个数)&#xff1a;4040 标注数量(txt文件个数)&#xff1a;4040 标注…

linux 安装redis

1. 更新系统和安装依赖 sudo apt update sudo apt install build-essential tcl2. 下载 Redis 源码(没有opt文件夹&#xff0c;则先创建opt文件夹) cd /opt wget http://download.redis.io/releases/redis-6.2.6.tar.gz3. 解压和编译 Redis 解压下载的文件&#xff0c;并进入…

Error: PostCSS plugin autoprefixer requires PostCSS 8.

引言 uniapp坑之使用vue-cli 拉去官方模板出错 版本&#xff1a; node:v14.15.0 npm:6.14.8 Vue CLI v5.0.8 拉取官方模板运行直接报错 原因: 通用说明是&#xff1a; autoprefixer 是版本过高 话说官方咋不解决这个插件问题&#xff0c;那位大佬知道原因 解决&#xff1a;…

OJ 括号生成

题目&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例&#xff1a; 代码分析&#xff1a; class Solution { public://进行回溯调用vector<string> generateParenthesis(int n) {if(…

Vue 项目hash和history模式打包部署与服务器配置

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在开发 Vue 项目时&#xff0c;Vue Router 提供了两种模式来创建单页面应用&#xff08;SPA&#xff09;的 URL&#xff1a;hash 模式和 history 模式。 简单说下两者的主要区别&#xff1a; hash 模式下的…

麦克风哪款好,领夹麦克风十大品牌,无线领夹麦克风推荐

在直播与Vlog盛行的今天&#xff0c;一款高质量的无线领夹麦克风无疑是内容创作者们提升音质、展现专业度的关键装备。传统有线麦克风及部分品质参差的无线领夹麦&#xff0c;虽能在一定程度上传递声音&#xff0c;却难以克服信号干扰、音质失真等技术瓶颈。更要警惕的是&#…

智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)

视频演示&#xff1a;基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目_哔哩哔哩_bilibili 基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目: https://pan.baidu.com/s/1f41gAfOOnlcQoKoMx3o84A?pwd6j2g 提取码: 6j2g 注&#xff1a;本项目为学习完…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

MySQL--库的操作

文章目录 1.创建数据库2.创建数据库案例3.字符集和校验规则3.1默认字符集3.2默认校验规则3.3查看系统默认字符集以及校验规则3.4查看数据库支持的字符3.5查看数据库支持的字符集校验规则3.6校验规则对数据库的影响不区分大小写查询&#xff1a;排序结果&#xff1a;区分大小写查…

综合案例-数据可视化-地图

一、pyecharts—地图快速入门 假设我们要将6个地区的某种数量在地图上标注出来&#xff0c;首先导入pyecharts包内地图相关模块&#xff0c;然后准备地图数据&#xff08;数据类型是列表&#xff0c;列表的元素类型为元组&#xff09;&#xff0c;然后把准备好的数据添加进地图…

51单片机个人学习笔记11(AT24C02-I2C总线)

前言 本篇文章属于STC89C52单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 [1-1] 课程简介_哔哩…

Ubuntu查看系统用户信息

0 Preface/Foreword 1 查看方式 1.1 查看系统用户 getent passwd getent: Get entries for Name Service Switch Libraries. 该命令会列出系统上所有用户的详细信息&#xff0c;包括用户名、密码、用户ID&#xff08;UID&#xff09;、组ID&#xff08;GID&#xff09;、用户描…

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码&#xff0c;打包独立部署或运营。 2. 环境准备 1&#xff09;通义千问 &#xff1a;https://tongyi.aliyun.com/qianwen 2&#xff09;0基础学习爬虫系列–网页内容爬取&#xff1a;https://blog.csdn.net/qq_36918149/article/details/14199…

Pytest-@pytest.fixture夹具篇(一)

一、定义 在Python的pytest测试框架中&#xff0c;pytest.fixture是一个&#xff08;不是唯一&#xff09;装饰器&#xff0c;用于定义一个测试夹具。 二、简单实例 使用参数autouserTrue pytest.fixture(autouseTrue) def my_fixture():print("Setup: 准备测试环境&q…

前端框架有哪些?

前言 用户体验是每个开发网站的企业中的重中之重。无论后台有多方面的操作和功能&#xff0c;用户的视图和体验都必须是无缝的最友好的。这需要使用前端框架来简化交互式、以用户为中心的网站的开发。 前端框架是一种用于简化Web开发的工具&#xff0c;它提供了一套预定义的代…

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机&#xff0c;暗影精灵8plus电竞主机&#xff0c;安装ubuntu后wifi怎么都搜不到热点&#xff0c;前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统&#xff0c;我用无线网连接了一下&am…

基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…