安装可寻址资产包
可寻址资产系统需要Unity版本2018.3或更高版本。
准备可寻址资产
将资产标记为可寻址
在UnitalEditor中,有两种方法可以将资产标记为可寻址:
- 在物体的Inspecter里。
- 在Addressable编辑器窗口。
使用Inspecter
在你的工程项目窗口中,选择要查看其Inspecter的所需资产。在Inspecter中,单击可寻址复选框并输入要标识资产的名称。
使用Addressable窗口
选择Window > Asset Management > Addressables > Groups打开可寻址组窗户。接下来,直接把需要标记的资源拖进相应组
指定地址
资产的默认地址(最左边的)是项目中资产的路径(例如,Assets/image/myImage.png)。右键菜单里可以自定义地址
第一次使用可寻址资产时,系统会将项目的一些编辑时间和运行时数据资产保存在Assets/AddressableAssetsData文件,该文件应添加到版本控制签入中。
构建可寻址内容
Addressables资产系统需要将您的内容构建到文件中,在构建应用程序之前,这些文件可以被运行的游戏使用。这个步骤不是自动的。您可以通过编辑器或API生成此内容(也就是打包):
- 若要在编辑器中生成内容,请打开可寻址组窗口,然后选择Build > New Build > Defult Build Script.
- 若要使用api生成内容,请使用AddressableAssetSettings.BuildPlayerContent().
使用可寻址资产
按地址加载或实例化
您可以在运行时加载或实例化可寻址资产。加载资产(Load)会将所有依赖项加载到内存中(如果适用,包括资产的捆绑数据),允许您在需要时使用该资产。这实际上并没有把你想要的资产放到你的场景中。要将资产添加到场景中,必须实例化。使用Addressable实例化接口将加载资产,然后立即将其添加到场景中。
若要使用字符串地址从游戏脚本访问资产,请声明UnityEngine.AddressableAssets命名空间,然后调用以下方法:
这将使用指定的地址加载资产。
Addressables.LoadAssetAsync<GameObject>("AssetAddress");
这会将具有指定地址的资产实例化到场景中。
Addressables.InstantiateAsync("AssetAddress");
注: LoadAssetAsync和InstantiateAsync是异步操作。您可以提供一个回调,以便在资产完成加载时使用它.
using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;
public class AddressablesExample : MonoBehaviour {
GameObject myGameObject;
...
Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;
}
private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
{
// In a production environment, you should add exception handling to catch scenarios such as a null result.
myGameObject = obj.Result;
}
}
次级资产和组件(Sub-assets and components)
组件
不能通过Addressable直接加载GameObject的组件。必须加载或实例化GameObject,然后从其中检索组件引用(getcompoment)。若要查看如何扩展Addressable以支持组件加载,请参见用例.
子资产
该系统支持加载子资产,但需要特殊的语法。潜在子资产的例子包括精灵工作表中的精灵,或者FBX文件中的动画剪辑。有关直接加载精灵的示例,请参见用例
要在资产中加载所有子对象,可以使用以下示例语法:
Addressables.LoadAssetAsync<IList<Sprite>>("MySpriteSheetAddress");
要在资产中加载单个子对象,可以这样做:
Addressables.LoadAssetAsync<Sprite>("MySpriteSheetAddress[MySpriteName]");
资产中可用的名称在主Addressables组编辑器窗口中可见。此外,还可以使用AssetReference,
若要访问资产的子对象,请执行以下操作。见下一节的说明。
使用AssetReference类
这个AssetReference类提供了一种访问可寻址资产的方法,而不需要知道它们的地址。若要访问可寻址资产,请使用AssetReference类:
- 从场景层次结构中选择一个游戏对象或工程项目窗户。
- 在Inspecter中,单击添加组件按钮,然后选择组件类型。任何可序列化的组件都可以支持
AssetReference
变量(例如,游戏脚本、ScriptableObject或其他可序列化的类)。 - 增加一个开发的
AssetReference
变量在组件中(例如,public AssetReference explosion;
). - 在Inspecter中,选择要链接到对象的可寻址资产(如下所示)。
若要加载或实例化AssetReference资产,调用其相应的方法。例如:
AssetRefMember.LoadAssetAsync<GameObject>();
AssetRefMember.InstantiateAsync(pos, rot);
子资产
如果将包含子资产(如SpriteAtlas或FBX)的资产添加到AssetReference中,则可以选择引用资产本身或子资产。你会看到的一个下拉列表变成了两个。第一选择资产本身,第二选择子资产.如果您选择第二个下拉列表,这将被视为对主要资产的引用。
构建考虑
流资产中的局部数据(Local data in StreamingAssets)
可寻址资产系统在运行时需要一些文件来了解要加载什么和如何加载它。生成Addressable数据并在流动资产文件夹,它是Unity中的一个特殊文件夹,它包含生成中的所有文件。生成Addressable内容时,系统将在库中分阶段处理这些文件。然后,当您构建应用程序时,系统将所需的文件复制到流动资产,生成并从文件夹中删除它们。这样,您可以为多个平台构建数据,同时只包含在每个构建中的相关数据。
除了特定于Addressable的数据外,任何构建供本地使用的数据的组也将使用特定于库平台的暂存位置。若要验证此操作是否有效,请在profile variables将构建路径和加载路径分别设置[UnityEngine.AddressableAssets.Addressables.BuildPath]
和{UnityEngine.AddressableAssets.Addressables.RuntimePath}
。你可以在控件设置(AddressableAssetSettings)中具体指定这些设置。(默认情况下,此对象位于项目的Assets/AddressableAssetsData
提前下载
调用Addressables.DownloadDependenciesAsync()方法加载传入的地址或标签的依赖项。通常,这是资产包。
这个AsyncOperationHandle此调用返回的结构包括PercentComplete
属性,可用于监视和显示下载进度。你也可以让应用程序等待直到内容加载完成。
如果您希望在下载前征求用户的同意,请使用Addressables.GetDownloadSize()返回从给定地址或标签下载内容所需的空间。请注意,这会考虑到任何以前下载的包,这些包仍然在联合的资产包缓存中。
尽管提前下载应用程序的资产可能是有利的,但在某些情况下,您可能选择不这样做。例如:
- 如果你的应用程序有大量的在线内容,而且你通常希望用户只与其中的一部分进行交互。
- 你有一个应用程序,必须连接到网上才能发挥作用。如果应用程序的所有内容都是小包,您可以选择根据需要下载内容。
您可以使用预加载功能来显示下载已经启动,而不是使用百分比完成值来等待内容加载,然后继续。此实现将需要一个加载或等待屏幕。
多平台构建
可寻址资产系统在构建应用程序内容时生成包含可寻址资产的资产包。资产包依赖于平台,因此必须为您想要支持的每个独特平台重新构建。
默认情况下,在构建Addressables应用程序数据时,给定平台的数据存储在Addressable构建路径的特定平台子目录中。运行时路径对这些平台文件夹进行了说明,并指向适用的应用程序数据。
注*如果使用AddressableBuildScriptPackedPlayMode脚本在编辑器播放模式下,Addressable将尝试加载当前活动生成目标的数据。因此,如果当前构建目标数据与当前编辑器平台不兼容,则可能会出现问题。
分组资产
在逻辑上将资产收集成多个组,而不是把它们都放在一个大组中,这是一个很好的做法。该方法的主要优点是避免了当多个贡献者对同一个文件进行编辑时,版本控制系统(VersionControlSystem,VCS)中的冲突。拥有一个大型资产组可能导致VCS无法干净地合并这些不同的更改。
构建打包在一起的场景(Building scenes that are packed together)
如果你有多个场景在一个寻址组内,做以下操作,这些场景将会相互依赖:
- 选择组,在Inspecter,设置组的打包模式为Pack Together
- 该组中的场景都有相同的资产标签(label),设置组的打包模式为Pack Together By Label.
如果您修改了其中一个分组场景,然后执行了content update build,所有相互依存的场景将一起移动到一个新的内容更新组中。