本文将总结Unity的Addressable资产系统的概要、优点和基本使用方法,主要是3个优点和基本使用方法,没有涵盖的内容或许会在其他文章中总结。
AssetBundle的管理目前有点麻烦
首先,为了了解Addressable资产系统的产生过程,需回顾一下Addressable资产系统出现之前的情况。
- Unity可以将下载内容压缩成AssetBundle形式发布。
- AssetBundle提供了压缩机制和解压缩后加载机制,
最多UnityWebRequestAssetBundle
的简单缓存机制,如下文所述。
因此,为了在游戏中实际使用可下载的内容,有必要实现各种实现,每个开发人员都实现了复杂的部分,例如内存管理和依赖关系管理。
然而,事实证明,所有开发人员都以相同的方式实现了它们中的大多数,在这种情况下,它应该被整合到游戏引擎中,可寻址资产系统就这样诞生了。
让我们看一下以前需要实现但现在由Addressable支持的一些功能。
顺便说一句,Addressable内部使用AssetBundle,因此如果对AssetBundle有基本的了解,则更容易理解。
AssetBundle的基础知识总结在下面的文章中,因此请根据需要参考。
可寻址资产系统的优点
选择负载源
作为以前需要独自实现的功能,有切换资源的加载源的功能。
即使是最终需要AssetBundle化读取资源的项目,在开发过程中也有可能不使用AssetBundle。这是因为AssetBundle不构建的话就无法确认,阻碍了快速的迭代。
因此…
需要制作允许用户选择AssetBundle还是AssetDatabase加载源的功能。

使用Addressable,只需切换单个设置即可完成此操作。

依赖关系管理
如果AssetBundle相互依赖,则必须首先加载加载目标所依赖的所有AssetBundle,有规范,需要加载的AssetBundle无法正常加载。
可以从下面的站内文章了解相关内容。
因此,有必要实现一个函数,该函数在加载AssetBundle时检索所有依赖项并首先加载它们。
但实际上,Addressable也支持这一点,当尝试加载资源时,它将提前加载所有依赖的AssetBundle。

此功能允许Addressables描述加载资源的过程,而无需担心依赖关系。
内存管理
AssetBundle的另一个难点是内存管理。例如,现在要加载如下图所示的AssetBundle A,
AssetBundle A中有AsetBundle B,所以也需要加载。

然后像下图一样加载AssetBundle C。
AssetBundle C也与AsetBundle B相连,它已经被加载,所以使用它。

这里考虑卸载AssetBundle A,这时,如果没有其他依存关系,就必须卸载AssetBundle B。
这个时候AssetBundle B和AssetBundle C是相连的,所以还不能卸载。

在卸载AssetBundle C的时候,需要卸载AssetBundle B。

像这样,做好AssetBundle的内存管理是很麻烦的,需要在内部预先拥有参考计数器等的实现。
Addresssables包含了基于这种依存关系的参照计数器的结构。也就是说,对某个AssetBundle加载一次,就必须卸载一次。
只要遵守这样的规则,就能保证包括依存关系在内的存储器的干净状态。
Addressable基本使用方法
安装
了解了概念之后,接下来将通过实际接触来理解Addressable。
首先进行安装,Addressable资产系统可以通过Package管理器进行安装。

Package Manager将在下面的文章中进行说明,请根据需要参考。
加上Addressable地址
那么实际使用Addressable的功能,作为Addressable的基本,首先要给资产加上地址。在Addressable中,不是指定资产路径或AssetBundle名,而是指定这个地址来加载资产。
由于不直接指定路径和AssetBundle名称,所以在选择负载源中说明的加载源的切换变得容易。
安装Addressable后,在资产的监视器中会出现Addressable这个选项。

启用这个复选框的话,就会分配地址。

默认是那个资产的路径,但是可以自由改变。

另外,附带地址的资产列表可以通过Window > Asset Management > Addressables > Groups查看。
当你打开这个窗口时,可以在Default Local Group中看到刚才的资产和地址。

在这个窗口中,可以编辑已有的地址,也可以拖拽资产来添加地址。
指定地址名后加载
然后通过地址加载这个资产,发展是addressables.loadassetasync()
使用。
using UnityEngine;
using UnityEngine.AddressableAssets;
public class Example : MonoBehaviour
{
private void Start()
{
Addressables
.LoadAssetAsync<GameObject>("Example") // 用字符串指定地址
.Completed += op => {
// 获取结果并实例化
// 错误处理本来是必要的
Instantiate(op.Result);
};
}
}
用完后用addressable . release()
卸载。
串行加载
另一种加载方法是将AssetReferenceXxx
类串行化。
[SerializeField]
private AssetReferenceGameObject _reference;
将其串行后就可以从Inspector中选择地址了。

然后,在这里指定的状态下使用LoadAssetAsync()
就可以加载对象的资产。
using UnityEngine;
using UnityEngine.AddressableAssets;
public class Example : MonoBehaviour
{
[SerializeField]
private GameObject _gameObject;
[SerializeField]
private AssetReferenceGameObject _reference;
private void Start()
{
_reference
.LoadAssetAsync()
.Completed += op => {
Instantiate(op.Result);
};
}
}
同样,用完后用_reference. releaseasset()
卸载,另外,这种方法即使重新命名地址,也不需要更改源代码。
Play Mode
Addressable具有从AssetDatabase或从AssetBundle读取资源等简单改变读取模式的功能。要使用它,打开Addressables Groups窗口的Play Mode Script下载。

每种模式的说明如下所示。
项目名称 | 说明 |
Use Asset Database(faseter) | 从AssetDatabase读取资产 |
Simulate Groups(advanced) | 从AssetDatabase读取资产, 分析AssetBundle的依赖关系 就像从AssetBundle读取一样。 |
Use Existing Build(requires built groups) | 从AssetBundle读取(根据需要构建) |
如果要使用Use Existing Build的话,在播放之前需要进行构建。构建从Addressables Groups窗口选择Build > New Build > Default Build Script。

另外,AssetBundle的读取源和构建路径可以自由设定,这在本文中不会做说明。
…
以上是3D天堂网关于可寻址资产系统的优点和使用方法的全部内容,如果你有任何反馈,请随时在本页面下方留言。