Unity Addressable Asset System可寻址资
产系统
可寻址资产系统提供了一种通过“地址”加载资产的简便方法。它通过简化内容包的打包创建、部署、下
载加载来简化资产管理。
可寻址资产系统使用异步加载,支持从任何位置进行加载,也支持自动加载依赖项。无论你原来使用直
接引用(类似直接在Inspector上引用Prefab),或是使用传统的assetbundle还是 Resources 文件夹
进行资产管理,迁移到Addressable都能让资产管理更简单。
Addressable视频教程
Addressable视频教程链接传送门
本课程为《大话Unity》系列的一个专题,更多专题课程详见《大话Unity》,购买系列课程更优惠。
【选修】Assetbundle
如果你还不了解Assetbundle?没关系,可以略过本教程中和Assetbundle有关的叙述,因为使用
Addressable时不需要你了解Assetbundle系统的具体功能。如果你对Assetbundle感兴趣,可以学习
Assetbundle相关内容: 链接传送门
微信扫描上图二维码可直接查看Assetbundle相关教程
为什么需要这个系统?
在Unity 4中,Unity引入了Assetbundle系统,这个系统可以将资产打包成离散的单元,以便在运行时
动态加载。使用Assetbundle可以将资源与程序安装包分开。这可以让程序的初始安装包保持较小的体
积,同时可以让程序能动态更新资源。
尽管Assetbundle有很多好处,但它是一个偏底层的系统,在实际生产中使用Assetbundle是一项复杂
的任务。Unity中没有直观的工作流来支持assetbundle开发使用的整个生命周期。另外如果想要将
Unity中直接引用和加载资产的方式转到Assetbundle上会很麻烦。将程序从纯静态的内置内容迁移到能
够通过增量更新的动态加载内容,需要大量的重构和自定义编程。因此,对于许多(即使不是大多数)
开发人员来说,是很头大的一件事。
Addressable设计思想
如果你咨询一个有Asset Bundle经验的开发者,几乎他们都编写了自己的类似Addressable的高级系
统。那Unity就发现这件事需要做一下。Addressable的诞生显然是因为需要一个框架来解决关于寻址、
打包和加载资产相关的一系列常见问题。
关注点分离:引用与打包资产
Addressables的主要功能是让你不再关心
prefab,文本资产等,都可以标记为Addressable,并赋予唯一的名称。一旦标记为addressable,就可
以在代码中使用新的AssetReference类型来引用和加载。另外,可寻址资产可以作为内置内容进行打包
和加载,也可以打包成assetbundle以在运行时动态加载。通过这种关注点的分离,有关内容打包和分
发的决策可以推迟到上线之前,而无需更改逻辑代码。
加载。任何资产,包括场景,
资源正在
从
运行时内存管理
什
么
如
何
哪
里
使用Assetbundle加载资源的优势在于:它可以从内存中
不再需要的资源。想要高效地跟踪加载了
哪些资源以及可以安全卸载哪些资源,在没有Addressable之前,是留给开发人员的复杂编程任务。现
在通过Addressable加载的资产及其依赖项,系统会自动进行引用计数,并且不再使用的assetbundle
及其依赖项会自动卸载。此外,Addressables提供了可视化Profiler,用于实时调试已加载的资产和
assetbundle引用计数。
更快的迭代
Addressable为资产加载过程提供了一些重要的抽象概念,内容发生更改时可以更快地迭代。
播放模式模拟:无需打包过程即可直接从磁盘加载资产,同时仍提供通过事件探查器调试资产引用
计数的功能。
快速增量构建:Addressables基于新的*Scriptable Build Pipeline
量构建的速度和可靠性。
Editor Hosting Services :内置的资源托管服务,用于将可寻址内容提供给局域网连接(也可以
利用花生壳,ngrok,natapp等转发到互联网)的设备。这种方法用于迭代设备上的内容非常快
捷,方便。
,可提高增
什么是资产?
资产是你用来创建游戏或应用的内容。常见的资产类型包括Prefab,纹理,材质,音频和动画。
什么是Addressable Asset可寻址资产?
通过将资产设置为“Addressable”,你可以使用该资产的唯一地址从任何地方获取它。不管该资产存在
本地应用程序中还是位于服务器上,可寻址资产系统都会找到并返回它。你可以通过它的地址加载单个
可寻址资产,也可以使用定义的自定义标签同时加载多个可寻址资产。
为什么要使用可寻址资产?
Unity原有的资产管理方式很难用。可寻址对象缩短了迭代周期,使你可以将更多时间用于设计,编码
和测试应用程序。
迭代时间:通过地址引用内容非常有效。对内容的优化不再需要更改代码。
依赖关系管理:系统返回所请求内容的所有依赖关系,以便在将内容返回给你之前加载所有网格,
着色器,动画等。
卸
载
(
可
编
程
构
建
管
道
)
内存管理:系统加载或卸载资产时,自动计数引用并提供强大的分析器,以帮助你发现潜在的内存
问题。
内容打包:因为系统可以映射并理解复杂的依赖关系链,所以即使在移动或重命名资产时,它也可
以有效打包。你可以轻松地为本地和远程部署准备资产,以支持可下载的内容和减小的应用程序大
小。
现有的游戏怎么办呢?
无论你使用直接引用(类似直接在Inspector上引用Prefab),Resources文件夹还是assetbundle,我
都为你提供了迁移指南(见后续内容)。
可寻址资产概述
可寻址资产系统包含两个Package:
Addressable包(主要包)
Scriptable Build Pipeline 可编程构建管线包(依赖项)
当安装Addressable包时,Scriptable Build Pipeline包会自动安装。
概念
本文档中引用了以下概念:
Address 地址:资产的位置标识符,可在运行时检索。
AddressableAssetData directory:将可寻址资产元数据(配置)存储在项目的Assets目录中。
Asset Group 资产组:可用于打包时处理的一组可寻址资产。
Asset group schema 资产组架构:定义可分配给Asset Group并在打包期间使用的一组数据。
AssetReference:对象的工作方式类似于直接引用,但具有延迟的初始化。该 AssetReference
对象将GUID存储为可按需加载的可寻址对象。
Asynchronous loading 异步加载:允许在开发过程中更改资产及其依赖项的位置,而无需更改
游戏代码。异步加载是可寻址资产系统的基础。
Build script 构建脚本:打包资产的脚本,并为资源管理器提供地址和
Label 标签:提供额外的可寻址资产标识符,可以用来在运行时加载相同label项(例如
Addressables.DownloadDependenciesAsync("spaceHazards"); )。
位置之间的映射。
入门指南
1.安装可寻址资产包
重要提示:Addressables需要Unity 2018.3或更高版本。
1、在Unity的菜单栏中打开:Windows > Package Manager
2、在Package Manager中找到Addressables并安装。
资
源
2.准备可寻址资产
1)将资产标记为Addressable
在Unity Editor中,有两种方法可将资产标记为可寻址:
在选中对象的Inspector中。
在“Addressable”窗口中。
方法1:在Inspector中标记Addressable
在“ Project”窗口中,选择所需的资产。在Inspector窗口中,单击Addressable复选框,然后输入用于
标识资产的地址,默认是资产在Project中的路径。
方法2:使用Addressable窗口标记资产
选择 Window > Asset Management > Addressables 打开Addressables窗口。接下来,将所需资
产从Project窗口拖动到Addressables窗口中任一资产组(同一资产组的资产打包时会包含在一个文件
中)。
2)设置地址
资产的默认地址是项目中资产的路径(例如Assets / images / myImage.png)。要在Addressables窗口
更改资产的地址,右键单击该资产,然后选择“ Rename”(重命名)。
首次使用可寻址资产时,系统会在Assets / AddressableAssetsData文件夹中为你的项目保存一些编辑和
运行时的数据资产,应将其添加到版本控制中。
3)【可选】添加Label标签
Addressable资产不仅可以通过地址加载,还可以通过Label进行批量加载。比如角色皮肤、不同质量的
纹理等等。
那么如何设置资产的Label呢?
1、首先需要在AddressableAssetSettings中添加Label。
2、给资产设置Label,可以逐个设置,也可以多选批量设置。
4)打包
在打包程序之前,需要将Addressable资产打包成游戏运行时可以使用的文件。此步骤不是自动的。你
可以通过编辑器或API打包以下内容:
要在编辑器中打包内容,请打开Addressables窗口,然后选择 Build > Build Player Content。
要使用API打包内容,请使用 AddressableAssetSettings.BuildPlayerContent() 。
3.使用Addressable Assets可寻址资产
开始之前呢,咱们先说说原来的 UnityEngine.Object.Instantiate() 存在的问题。
Instantiate()的问题
Instantiate 这个API你应该很熟悉了,没有Addressable之前,所有GameObject的实例化都要通过
这个方法,但是这个方法存在几个问题:
实例化过程是同步的,也就是程序会阻塞在Instantiate这个地方,直到实例化完成。如果加载大资
源或很多资源容易造成卡顿的情况。
实例化前资源需要已经在本地。如果资源在网络上,需要你自定处理寻址、下载、解包、缓存的过
程,再往前推,你也要自行处理打包的过程。
那么使用Addressable加载有什么不同呢?我们一起来看一下。
方法1:通过地址加载或实例化
你可以在运行时加载或实例化可寻址资产。加载资产时会将所有依赖项加载到内存中(支持
assetbundle),使你可以在需要时使用资产。
要在脚本中使用字符串地址访问资产,先声明 using UnityEngine.AddressableAssets; 名称空间,
然后调用以下方法:
Addressables.LoadAssetAsync("AssetAddress");
加载完成后并不会将所需的资产实例化到场景中。要将资产添加到场景中,还需要一步:实例化。
还有一个加载和实例化二合一的接口,这个接口会加载资产,然后立即将其实例化到场景中:
Addressables.InstantiateAsync("AssetAddress");
这会将具有指定地址的资产实例化到场景中。
注意: LoadAssetAsync 和 InstantiateAsync 是异步操作。你可以在资产完成加载后提供一个回调来
使用资产。(有关更多信息,请学习后续异步操作处理的教程)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;
public class AddressablesExample : MonoBehaviour {
GameObject myGameObject;
void Start{
Addressables.LoadAssetAsync("AssetAddress").Completed +=
OnLoadDone;
}
private void
OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle obj)
{
// In a production environment, you should add exception handling to
catch scenarios such as a null result.
myGameObject = obj.Result;
}
}
Addressable加载的优点
InstantiateAsync()
异步实例化,系统不会阻塞
大量实例化不会卡住系统
LoadAssetAsync()
异步加载
资源可以在本地,也可以在远端服务器,而且你在编写代码时不需要关心
特殊情况:加载子资产或组件
子资产和组件是资产加载时的特殊情况。
组件
你不能直接通过可寻址对象加载组件。你必须加载或实例化GameObject,然后从中检索组件引用。要
查看如何扩展可寻址对象以支持组件加载,可参阅ComponentReference示例或学习本教程后续的视频
教程。
子资产
系统支持加载子资产,但是需要特殊的语法。子资产比如Sprite图集中的Sprite或FBX文件中的动画剪
辑。有关直接加载精灵的示例,请参见精灵加载示例或学习本教程后续的视频教程。
要加载资产中的所有子对象,可以使用以下示例语法:
Addressables.LoadAssetAsync>("MySpriteSheetAddress");
要在资产中加载单个子对象,可以执行以下操作: Addressables.LoadAssetAsync
("MySpriteSheetAddress[MySpriteName]");
资产中子资产可用的地址在Addressable窗口中可见。