原文 https://docs.unity3d.com/Packages/com.unity.addressables@0.4/manual/AddressableAssetsOverview.html
目录
Addressable Assets 概述
Addressable Assets 由三个包组成
- Addressable Assets package(主要包)
- Resource Manager package (依赖包)
- Scriptable Build Pipeline package(依赖包)
当你安装了Addressable Assets包,Resource Manager和Scriptable Build Pipeline packages会在同一时间自动安装。
概念
- Address - 标识一个资产以便于在运行时检索
- AddressableAssetData 目录 - 在Project的Assets目录中存储可寻址资产的元数据。
- Asset Group - 表示可用于构建时处理的一组可寻址资产
- Asset Group Schema - 定义可以分配给组并在构建期间使用的一组数据。Asset Group组构建的数据是由Schema组成,Schema有点跟Component类似。通过多个Schema可以组成自己的构建数据。
- AssetReference - 一个对象,其操作类似于直接引用,但具有延迟初始化(例如,对于延迟加载)。AssetReference将GUID存储为可按需加载的可寻址。简单理解AssetReference类存储Asset的GUID,通过GUID可直接加载Asset,而不需要知道Asset的地址。
- Asynchronous Loading - 允许在整个开发过程中更改资产和依赖项的位置(例如,本地,远程和生成)的位置,而无需更改游戏代码。异步加载是可寻址资产系统的基础。
- Build Script - 运行资产组处理器来打包资产,并提供资源管理器的地址和资源位置之间的映射。构建配置后续有时间会进行相应的介绍
- Label - 对相似的资源在加载时提供了额外的可寻址资产标识符。例如
LoadAll(“spaceHazards”);
Addressable Assets 入门
安装Addressable Assets包
版本要求2018.2或更高版本
要安装此软件包,请按照软件包管理器文档中的说明进行操作。
资产标记可寻址
有两种方法可以将项目标记为可寻址资产。 安装可寻址资产包后,一种是通过在Inspector 窗口中将资产标记为可寻址,该资产默认归在Asset Group的default组中,另外一种是将资产拖到Addressables 窗口中的Asset Group组下。
- Inspector窗口的标记方式
在项目的Inspector 窗口中,单击“地址”复选框,然后输入名称以标识“资产”。
- Addressables 窗口的标记方式
1、打开Addressables 窗口,请单击工具栏中的Window > Asset Management > Addressable Assets即可
2、将Project窗口的资源文件夹拖动Addressables 窗口的资源组中。
资产的默认地址是项目中资产输入的路径。 例如,Assets / images / myImage.png。 您可以使用Addressables 窗口将地址更改为任何唯一名称。
要更改地址,请双击资产的当前地址并输入新地址。
当您第一次开始使用可寻址资产时,系统会在Assets / AddressableAssetsData中为您的项目保存一些编辑时和运行时数据资产,这些数据应添加到您的版本控制签入中。
按地址加载或实例化
您可以在运行时加载或实例化资产。您可以在运行时加载或实例化资产。 加载资产会将所有依赖项加载到内存中(如果相关,则包括资产包数据)。 这允许您在需要时使用资产。 实例化加载资产,然后立即将其添加到场景中。简单理解就是说,在运行时加载或者实例化资源的时候,如果有依赖其它资源,会将其它资源先加载到内存中,然后在实例化资源。这跟传统的Asset bundle有很大的区别。传统Asset Bundle需要先加载依赖的资源然后才能实例化。而通过Addressable Asset System则实现了自动化。调用API的时候会自动将依赖的资源进行加载。
要使用字符串地址访问脚本中的资产:
Addressables.LoadAsset(“AssetAddress”);
或者
Addressables.Instantiate(“AssetAddress”);
LoadAsset和Instantiate是异步操作。 加载后,您必须提供回调以使用资产。
GameObject myGameObject;
...
Addressables.LoadAsset<GameObject>("AssetAddress").Completed += onLoadDone;
}
private void private void onLoadDone(UnityEngine.ResourceManagement.IAsyncOperation<Sprite> obj)
{
// In a production environment, you should add exception handling to catch scenarios such as a null result;
myGameObject = obj.Result;
}
使用AssetReference类
AssetReference类提供了一种访问资产的机制,而无需知道字符串(或其他)地址。
要使用* AssetReference *类访问可寻址资产:
1、选择一个资产。
2、在Inspector面板中,单击“添加组件”按钮,然后选择组件类型。
3、在组件中添加公共AssetReference对象。 例如:
public AssetReference explosion;
4、在Inspector面板中,通过将“资源”从“项目”窗口拖到条目上或单击条目以从以前定义的可寻址资产中进行选择(如下所示),设置对象链接到的资产。
通过对象引用加载可寻址资产
要加载AssetReference,请调用其上定义的方法之一。 例如:
AssetRefMember.LoadAsset<GameObject>();
或者
AssetRefMember.Instantiate<GameObject>(pos, rot)
LoadAsset和Instantiate是异步操作。 加载后,您必须提供回调以使用资产。
提前下载
调用Addressables.PreloadDependencies方法会加载您传入的地址或标签的依赖关系。通常,这是资产包。
简单理解,该方法为预加载的功能,会将资源所依赖的资源进行加载。
此调用返回的IAsyncOperation对象包含PercentComplete属性,可用于监视下载进度。您可以使用完成百分比来显示进度条,让应用程序等到内容加载完毕。
虽然提前为您的应用程序下载资产可能是有利的,但有些情况下您可能选择不这样做。例如:
1、如果您的应用拥有大量在线内容,并且您通常希望用户只与其中的一部分进行互动。
2、您有一个必须在线连接才能运行的应用程序。例如,多人游戏。如果应用程序的所有内容都是小包,您可以选择等待并根据需要下载内容。
3、您也可以选择部分使用预加载功能。您可以开始下载然后继续,而不是要等到百分比完成才对内容加载。实际加载资产时,您需要稍后创建加载/等待屏幕。如果预加载已完成,则加载速度很快,否则应用程序需要等到内容加载完毕。