前段时间Unity官方发布消息称,可寻址资源系统已经脱离预览阶段,并将在Unity2019.3作为已验证资源包发布,同时在Unity 2018.4 LTS版本中得到支持。花了点事件研究了一下这个系统。官方文档入门介绍还是不错的。本文翻译自官方文档并加入一点自己的理解。原文链接
标记资源为可寻址的
这里有两种方式将资源标记成可寻址的,在安装好可寻址资源包后,你可以在属性面板进行标记或者将其拖拽到可寻址窗口上。
在资源的属性窗口上,点击Address复选框并为资源设置唯一标识符。
要打开可寻址窗口,点击 Window > Asset Management > Addressable Assets。将项目窗口的资源拖拽到可寻址窗口的一个群组下。(不能拖拽一整个文件夹,否则你会看到可寻址窗口下你拖拽的文件夹下的资源都是灰色的,代码也无法加载)
你的资源的默认地址是它在项目中的路径,比如Assets/images/myImage.png.。你可以使用可寻址窗口将资源的地址改为任何独特的名字。
要改变资源的地址,双击当前资源的地址并输入一个新的地址(但在我的实际操作中,在可寻址窗口上双击是无效的,按F2可以,当然也可以直接在资源的属性面板中更改)。
当你第一次使用可寻址资源时,系统会为你的项目在Assets/AddressableAssetsData保存一些编辑时和运行时的数据资源。这些数据应当被添加到版本控制检查当中。
建立你的游戏
在打包项目之前,可寻址系统需要你的资源打包成运行时的游戏可以使用的文件(依然是ab包)。这个步骤不会自动完成,开发者需要通过UI或者API自行完成。
1. 打开可寻址窗口,选择 Build->Build Player Content
2. AddressableAssetSettings.BuildPlayerContent()
通过地址加载或实例化资源
你可以在运行时加载或实例化资源。加载资源的同时会将所有的依赖加载进内存中,不再需要自己进行依赖包的管理。下面是加载和实例化对应的API,“AssetAddress”是资源的地址。
加载 Addressables.LoadAssetAsync(“AssetAddress”);
实例化 Addressables.InstantiateAsync(“AssetAddress”);
这两个函数都是异步操作,你可以提供一个回调函数在资源加载完成后调用。
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;
}
子资源和组件
使用AssetReference类
AssetReference类提供了一种不要知道资源地址的访问机制。
- 选择一个资产
- 在属性面板中,点击 Add Component 按钮之后选中一个组件类型
- 为选择的组件添加一个公共字段
- 在属性面板上就可以看到这个字段了,选择要链接的资产就好了。
通过AssetReference类加载可寻址资源
当在自己的组件中定义了一个名为AssetRefMember的AssetReference类的字段后,可以通过下面的API加载或者实例化资源。
加载 AssetRefMember.LoadAssetAsync();
实例化 AssetRefMember.InstantiateAsync(pos, rot);
这两个函数同样也是异步的,我们可以为它们添加回调函数。