Addressables的基本概念


Addressables系统有以下几个基本概念:

  • Asset address: 资源路径(asset address)是一个用来标识Addressable资源的字符串ID。你可以把路径作为key来加载对应的资源。你也可以将多个资源设置成同一个资源路径名,在加载的时候会同时加载这多个资源。(但是打成的Assetbundle会是多个)
  • AssetReference: 在Unity原有系统中,你想要在代码中引用一个资源,需要使用GameObject或对应的类型。在Addressables中统一使用资源引用(AssetReference)作为引用资源的类型。在加载资源的时候,你可以把AssetReference对象作为key传递给Addresables.LoadAssetAsync接口。AssetReference自己也提供了相应的加载接口。
  • Label: 你可以给多个Asset设置的标签。可以用Label来标记一组相关的资源,然后用它来加载它们。
  • Asset Location: ResourceLocation是一种运行时对象,它描述了如何加载一个资源以及它的依赖项。你可以将它作为key来加载对应的资源。
  • Key: Key是一个用来标识一个或多个资源的对象。Key包含了地址(address),标签(label),AssetReference实例以及Location对象。
  • Asset loading and unloading: Addressables的API提供了运行时加载与释放资源的函数
  • Dependencies: 依赖项。当资源A被资源B所引用,那么A则被称为B的依赖项,比如场景中被用到的Prefab,或者Prefab中所包含的材质
  • Dependency and resource management: 依赖与资源管理。Addressables系统使用引用计数来根据哪些资源与Assetbundle正在被使用,以及系统是否需要加载或者下载它们的dependencies(依赖项,被引用到的其它资源)
  • Group: 组。资源在Editor里被设置到各个Group中。每个Group的设置决定了其中的资源是如何被打到Assetbundles中,以及它们在运行时是如何被加载的。
  • Content catalogs: 内容目录。这是一个json文件,它记录了Addressables地址到资产实际物理地址的映射。
  • Content builds: 在使用Addressables系统时,你必须在导出Player之前执行一步单独的Content build操作来收集、打包资源。
  • Multiple platform support: 多平台支持。系统会隔离开各个平台打出来的资源,并在运行时从正确的路径加载资源。
  • Addressables tools: Addressables系统提供了一些工具来分析、制作和优化你的内容。

Addressables默认使用Assetbundle来打包和访问你的所有资源。你也可以实现你自己的IResourceProvider类来支持其他访问资源的方式。

Asset addresses
Addressables系统的主要功能,就是你给资源分别设定好路径,之后在运行时使用这些路径来加载对应的资源。Addressables资源管理器会在内容目录中查找这些地址,找出其对应资源所保存在位置。(资源可以是在你的应用包体内,缓存在设备本地,或者存放在远端服务器)资源管理器随之会加载对应资源及其依赖,如果有必要的话也会从远端服务器先下载资源内容。
[size=16]不管资源被放置在哪儿,Addressables系统都能根据地址来加载它[/size]
由于资源地址并没有绑定到某个物理地址,所以不管是在编辑器内还是在运行时,你都可以很灵活地管理资源。内容目录(Content catalogs)维护了资源地址到物理路径的映射。
一般来说,你会给每个资源设定一个唯一的地址,但这并不是必须的。你也可以给不同的资源设定同样的地址字符串(address string)。你还可以使用标签(label)来组合多个资源分组,例如有如下几个资源:

  • Asset 1: path: “Assets/Done_Bolt.prefab” address: “Done_Bolt”, label: “default”
  • Asset 2: path: “Assets/Done_Bolt_Enemy.prefab” address: “Dont_Bolt”, label: “preload”
  • Asset 3: path: “Assets/Rock.prefab” address: “Rock” label: “preload”

你可以通过在调用Addressables.LoadAssetsAsync的时候,通过传入不同的Keys来控制想要加载的资源组合。详见用Addressables加载资源

AssetReference
你可以在MonoBehaviour或者ScriptableObject的派生类里添加一个AssetReference属性,然后在Inspector里把其他资源拖到上面,类似原来的GameObject属性。但是不同的是,AssetReference并不会在运行时自动加载相关的资源,你必须手动调用它的API来控制资源的加载与卸载。
除了基本的AssetReference类之外,Addressables还提供了一些更具体的类,例如AssetReferenceGameObject与AssetReferenceTexture。你可以使用它们来限制所引用的资源类型。另外,你也可以使用一些attribute,例如AssetReferenceUILabelRestriction来对属性进行限制。

Loading and releasing assets
想要加载资源,你可以使用资源地址或其他Key(比如Label或者AssetReference)来加载。你只需要加载你想要的资源,Addressables会帮你处理依赖项的加载。
当应用不再需要某个资源的时候,你必须调用release接口来释放它(release it),这样系统才能释放相关联的内存。Addressables内部对每个已加载的资源保存了一个引用计数,当计数到0时释放该资源。你要做的只是在不需要某个资源的时候调用release接口来通知系统。

Dependency and resource management
在Unity中,一个资源往往会依赖于其他资源。比如一个场景有可能引用到一个或多个Prefab,一个Prefab可能使用一个或多个材质。当你加载一个资源的时候,系统会自动寻找并且加载它的所有依赖资源。当系统卸载这个资源的时候,它也同样会卸载它的依赖资源,除非它们此时还被其它资源使用着。如果这些资源是在assetbundle中并且该assetbundle中没有其他资源被使用,那么当这些资源被卸载的时候系统同时也会卸载相关的assetbundle。

Addressables groups and labels
你可以使用Group来组织你的资源。每一个Addressables资源都必须属于某个组。如果你没有给你的资源设定一个组,系统会把它加到默认组里。
你可以通过每个Group的Group Setting来指定Addressables系统如何打包该Group中的资源。例如,你可以选择是否将其中的资源都打到一个assetbundle文件中。
Label是用来标记你的资源用的。例如,假设你有3个label分别是“红色”、“帽子”和“羽毛”,你可以在一次操作中加载所有红色的羽毛帽子(使用MergeMode.Intersection过滤中同时带有这3个label的资源),就算它们不在同一个assetbundle中。
在Addressables Groups窗口中,你可以在Group之间移动资源,也可以给它们设定Label。

Group schemas
组模式(Group schema)是组成组设置(Group settings)的一部分,每个组模式都指定了这个组内的资源(assets)在某些方面是如何被处理的。一个Group schema其实就是一个定义了一组设置的ScriptableObject。你可以给一个Group绑定无数个Schema。Addressables系统预先定义了一些组模式,你也可以自定义一些模式来支持你自己的编译脚本(Build script)和工具。
自带的组模式有如下几个:
Content Packing & Loading: 这是最主要的schema,它被用来配合默认的编译脚本(default build script)并且定义了如何打包和加载Addressable资源。
Content Update Restrictions: 决定该组资源是否会被用于热更,即发布后就保持不变的本地资源(Cannot Change Post Release)还是需要被热更的资源(Can Change Post Release)。这个配置会被用于资源变更检查工具(Check for Content Update tool)。
Resources and Built In Scenes: 可以设置是否带有[color=purple]Resources[/color]目录(Include Resources Folders)及是否带有[color=purple]BuildSettings[/color]中的场景列表(Include Build Settings Scenes)。

[size=16]目前自带的3个Schema[/size]
对Group schema具体的深入研究可以看这篇文章

Content catalogs
内容目录(Content catalog)是Addressables系统生成的一个json格式的文件。它映射了资产地址(address)到它们的物理位置。对于每个工程Addressables会且只生成一个content catalog,但是你可以加载其他工程所生成的catalog来加载它们工程中的Addressables资产。这个功能让你可以将开发工程和资源工程分开来,方便开发。
当Addressables生成内容目录时,它同时也会生成一个哈希文件包含catalog文件的哈希值。如果你需要将你的Addressables资产放置在远端服务器(即热更服务器),系统需要使用这个哈希文件来判断是否内容目录是否需要被下载(是否需要更新)。

Content builds
Addressables系统将资源内容创建和Player的生成分离了开来。一次内容创建(content build)会生成内容目录(content catalog)、目录哈希文件(catalog hash)以及包含你资产的AssetBundle。
资产格式是平台相关的,所以你必须在生成Player之前为你每一个平台进行一次内容创建(content build)。

Play mode scripts
当你每次在编辑器(Editor)里进入Play模式时,每次都进行一次内容创建(content build)既不方便又很慢。但是同时你又想尽可能的贴近真实的运行环境。为了方便起见,Addressables提供了三个选项来让你选择系统在Play模式下如何定位和加载资产:
Use the Asset database: 直接使用Assetdatabase类来加载资源。这个选项提供了最快的开发迭代速度,但是距离真实运行环境是最遥远的。
Simulate groups: Addressables会模拟真实的加载过程。你也可以通过延迟来让系统模拟远端AssetBundle的下载过程和本地bundle的加载过程。你也可以在这个模式下使用Event Viewer。
Use existing build: 使用你上一次内容创建的结果。最贴近真实环境。当你使用这个选项之前你必须先进行一次完整的内容创建。

Addressables tools
Addressable Groups window: 组窗口(Groups window)是Addressable最主要的窗口。它可以管理资产,组设置(group settings)和进行内容创建。

Profiles window: 用来设置各种路径。

Addressables Event Viewer: 你可以从Event Viewer监控和查看Addressables相关的运行时事件(runtime events)和性能。

Analyze tool: Addressables的Analze tool可以用来运行各种分析规则(analyze rules)。比如可以检查多个assetbundle是否引用了相同的资源,也可以显示每个assetbundle的组成。你也可以派生[color=blue]AnalyzeRule[/color]来创建你自定义的规则。

Hosting tool: 这是一个可以提供你测试资源发布的工具。你可以在其中将一个本地资源目录设置为一个Http站点。你还可以设置一个派生自IHostingService的类为资源发布处理逻辑。

对于Hosting tool的详细说明可以看这篇文章
Build layout report: 这个工具比较特殊,要打开它,需要进入菜单Edit>Preferences>Addressables,勾选”Debug Build Layout”。

[size=16]Preferences中的Addressables选项页[/size]
勾选这个选项后,每次进行内容创建(content build)时都会在[color=purple]Library\com.unity.addressables[/color]生成一个buildlayout.txt文件。

[size=16]Demo工程Spaceshooter所创建的buildlayout文件[/size]
里面是这次Build的相关信息。例如有AssetBundle的大小、携带的资源、所依赖的资源等。可以使用这个文件对AssetBundle进行分析,比如分析是否有重复的依赖项等。
Build Profiling: 每次进行内容创建(content build)时都会在[color=purple]Library\com.unity.addressables[/color]生成一个AddressablesBuildTEP.json文件。要查看这个文件,可以在chrome的地址栏中输入chrome://tracing,然后点击”Load”加载这个文件。从中可以看到Build时候的一些运行开销。

[size=16]Demo工程Spaceshooter所创建的AddressablesBuildTEP文件[/size]

,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注