本文介绍如何修改现有项目以利用可寻址资产。
在 Addressables 系统之外,Unity 提供了一些“传统”方式来引用和加载资产:
- Scene data:您直接添加到场景或场景中的组件的资产,应用程序会自动加载这些资产。Unity 将序列化的场景数据和场景直接引用的资产打包到一个存档中,并将其包含在您构建的播放器应用程序中。请参阅转换场景和在不可寻址场景中使用可寻址资产。
- Prefabs:您使用游戏对象和组件创建的资产,并保存在场景之外。请参阅转换预制件。
- Resources folders:您放置在项目的资源文件夹中并使用资源 API 加载的资产。Unity 将资源文件中的资产打包到一个存档中,并将其包含在您构建的播放器应用程序中。资源存档与场景数据存档是分开的。请参阅转换资源文件夹。
- AssetBundles:您打包在 AssetBundles 中并使用 AssetBundle API 加载的资产。请参阅转换 AssetBundle。
- StreamingAssets:您放置在 StreamingAssets 文件夹中的文件。Unity 在您构建的播放器应用程序中按原样包含 StreamingAssets 文件夹中的所有文件。查看StreamingAssets 中的文件
转换为可寻址
使用 Addressables 构建的内容仅引用在该 Addressables 构建中构建的其他资产。使用或引用的内容包含在两个可寻址中,并且通过场景数据和资源文件夹构建的播放器将在磁盘和内存中复制(如果它们都已加载)。由于此限制,推荐的最佳做法是将所有场景数据和资源文件夹转换为 Addressables 构建系统。减少由于复制导致的内存开销,并允许使用 Addressables 管理所有内容。允许内容可以是本地的或远程的,也可以通过内容更新构建进行更新。
转换场景
将 Addressables 集成到项目中的最简单方法是将场景移出Build Settings列表并使这些场景可寻址。您确实需要在列表中有一个场景,即应用程序启动时 Unity 加载的场景。您可以为此创建一个新场景,它除了加载您的第一个可寻址场景外什么都不做。
要转换场景:
- 制作一个新的“初始化”场景。
- 打开构建设置窗口(菜单:文件 > 构建设置)。
- 将初始化 Scene 添加到 Scene 列表中。
- 从列表中删除其他场景。
- 单击项目列表中的每个场景,并在其检查器窗口中选中可寻址选项。或者,您可以将场景资源拖到“可寻址组”窗口中的一个组中。(不要让你的新初始化场景可寻址。)
- 更新用于加载场景的代码,以使用Addressables类场景加载方法而不是 SceneManager 方法。
此时,您已将场景中的所有资产包含在一个 Addressable 组中,当您构建 Addressables 内容时,Addressables 系统将它们打包在一个 AssetBundle 中。如果您只对所有场景使用一个组,则运行时加载和内存性能应该大致相当于您项目的 pre-Addressables 状态。
您现在可以将一个大型可寻址场景组拆分为多个组。最好的方法取决于项目目标。要继续,您可以将场景移动到它们自己的组中,这样您就可以独立地加载和卸载它们中的每一个。执行此操作时,您可以使用分析工具检查多个场景之间共享的重复资产。您可以通过使资产本身可寻址来避免重复从两个不同的包中引用的资产。通常最好将共享资产也移动到它们自己的组中,以减少 AssetBundle 之间的相互依赖性。
在不可寻址场景中使用可寻址资产
对于不想设为可寻址的场景,您仍然可以通过AssetReferences使用可寻址资产作为场景数据的一部分。
当您将 AssetReference 字段添加到自定义 MonoBehaviour 或 ScriptableObject 类时,您可以将可寻址资产分配给 Unity 编辑器中的字段,其方式与将资产分配为直接引用的方式大致相同。主要区别在于您需要向您的类添加代码以加载和释放分配给 AssetReference 字段的资产(而 Unity 在场景中实例化您的对象时会自动加载直接引用)。
笔记
您不能将可寻址资产用于非可寻址场景中任何 UnityEngine 组件的字段。例如,如果您将可寻址网格资产分配给非可寻址场景中的 MeshFilter 组件,Unity 不会为该场景使用该网格数据的可寻址版本。相反,Unity 复制网格资产并在您的应用程序中包含两个版本的网格,一个在为包含网格的可寻址组构建的 AssetBundle 中,一个在非可寻址场景的内置场景数据中。(在可寻址场景中使用时,Unity 不会复制网格数据并始终从 AssetBundle 加载它。)
要在自定义类中用 AssetReferences 替换直接引用,请执行以下步骤:
- 将您对对象的直接引用替换为资产引用(例如,
public GameObject directRefMember;
becomespublic AssetReference assetRefMember;
)。 - 将资产拖到适当组件的检查器上,就像直接引用一样。
- 添加运行时代码以使用Addressables API加载分配的资产。
- 添加代码以在不再需要时释放加载的资产。
有关使用 AssetReference 字段的更多信息,请参阅资产引用。
有关加载可寻址资产的更多信息,请参阅加载可寻址资产。
转换预制件
要将预制件转换为可寻址资产,请选中其检查器窗口中的可寻址选项,或将其拖到可寻址组窗口中的组中。
在可寻址场景中使用时,您并不总是需要使预制件可寻址;Addressables 自动包含您添加到场景层次结构中的预制件,作为场景的 AssetBundle 中包含的数据的一部分。但是,如果您在多个场景中使用预制件,则应将预制件制作成可寻址资产,这样预制件数据就不会在使用它的每个场景中重复。如果你想在运行时动态加载和实例化它,你还必须制作一个 Prefab Addressable。
笔记
如果您在不可寻址场景中使用预制件,无论预制件是否可寻址,Unity 都会将预制件数据复制到内置场景数据中。您可以使用分析工具中的检查场景到可寻址重复依赖项规则来识别可寻址资产组和非可寻址场景数据之间重复的资产。
转换资源文件夹
如果您的项目在 Resources 文件夹中加载资产,您可以将这些资产迁移到 Addressables 系统:
- 使资产可寻址。为此,请在每个资产的检查器窗口中启用可寻址选项,或将资产拖到可寻址组窗口中的组中。
- 更改任何使用Resources API加载资产的运行时代码,以使用Addressables API加载它们。
- 添加代码以在不再需要时释放加载的资产。
与场景一样,如果将所有以前的资源资源放在一组中,加载和内存性能应该是等效的。根据您的项目,您可以通过将资产分成不同的组来提高性能和灵活性。使用分析工具检查 AssetBundle 之间是否存在不需要的重复。
当您将资源文件夹中的资产标记为可寻址时,系统会自动将该资产移动到项目中名为 Resources_moved 的新文件夹中。移动资产的默认地址是旧路径,省略文件夹名称。例如,您的加载代码可能会更改为:
Resources.LoadAsync\<GameObject\>("desert/tank.prefab");
到:
Addressables.LoadAssetAsync\<GameObject\>("desert/tank.prefab");.
在修改项目以使用 Addressables 系统后,您可能必须以不同方式实现Resources类的某些功能。
例如,考虑Resources.LoadAll函数。以前,如果您在文件夹 Resources/MyPrefabs/ 中有资产,并运行 Resources.LoadAll<SampleType>("MyPrefabs");,它会加载 Resources/MyPrefabs/ 匹配类型中的所有资产SampleType
。Addressables 系统不支持这个确切的功能,但您可以使用 Addressable labels获得类似的结果。
转换 AssetBundle
当您第一次打开Addressables Groups窗口时,Unity 会提供将所有 AssetBundle 转换为 Addressables 组的功能。这是将 AssetBundle 设置迁移到 Addressables 系统的最简单方法。您仍然必须更新运行时代码以使用Addressables API 加载和释放资产。
如果您想手动转换您的 AssetBundle 设置,请单击忽略按钮。手动将 AssetBundle 迁移到 Addressables 的过程类似于场景和 Resources 文件夹中描述的过程:
- 通过在每个资产的检查器窗口中启用可寻址选项或将资产拖到可寻址组窗口中的组,使资产可寻址。Addressables 系统会忽略资产的现有 AssetBundle 和 Label 设置。
- 更改使用AssetBundle或UnityWebRequestAssetBundle API加载资产的任何运行时代码,以使用Addressables API加载它们。您不需要显式加载 AssetBundle 对象本身或资产的依赖项;Addressables 系统会自动处理这些方面。
- 添加代码以在不再需要时释放加载的资产。
笔记
资产地址的默认路径是其文件路径。如果您使用路径作为资产的地址,您将以与从包中加载相同的方式加载资产。可寻址资产系统处理包及其所有依赖项的加载。
如果您选择自动转换选项或手动将您的资产添加到等效的 Addressables 组,那么根据您的组设置,您最终会得到包含相同资产的同一组捆绑包。(捆绑文件本身不会完全相同。)您可以使用分析工具检查不需要的重复和其他潜在问题。您可以使用 [事件查看器] 窗口确保资产加载和卸载的行为符合您的预期。
StreamingAssets 中的文件
当您使用 Addressables 系统时,您可以继续从 StreamingAssets 文件夹加载文件。但是,此文件夹中的文件不能是可寻址的,文件也不能引用项目中的其他资产。
Addressables 系统确实在构建期间将其运行时配置文件和本地 AssetBundle 放在 StreamingAssets 文件夹中。(Addressables 在构建过程结束时删除这些文件;您不会在编辑器中看到它们。)