1.什么是Addressable(可寻址资产)系统
可寻址资产系统提供了一种通过“地址”加载资产的简便方法。它通过简化内容包的创建和部署来处理资产管理开销。可寻址资产系统使用异步加载来支持从任何位置加载任何依赖项集合。
一旦资产被标记为“可寻址”,就可以从任何地方调用可寻址资产。无论该可寻址资产是驻留在本地播放器还是内容传送网络上,系统都将找到并返回它。您可以通过其地址加载单个可寻址,或使用您定义的自定义组标签加载许多可寻址。
2.为什么要推出Addressable系统
迭代时间:通过其地址引用内容是超级高效的。使用地址引用,只会检索内容。对内容的优化不再需要更改代码。
依赖关系管理:系统不仅返回地址的内容,还返回该内容的所有依赖关系。系统会在整个资产准备就绪时通知您,因此在返回内容之前会加载所有网格,着色器,动画等。
内存管理:该地址不仅可以加载资产,还可以卸载它们。引用会自动计算,强大的分析器可帮助您发现潜在的内存问题。
内容打包:由于系统映射并理解复杂的依赖关系链,因此即使在移动或重命名资产时,它也可以有效地打包捆绑包。可以为本地和远程部署轻松准备资产,以支持可下载内容(DLC)和减少应用程序大小。
3.Addressable系统对比AssetBundle有什么区别
我初步学习了可寻址系统后,也算是对它有了一个了解。
Addressable Assets System 是由 Addressables和ResourceManager组成的系统!
Addressables和ResourceManager位于不同的包中
Addressables 依赖于 ResourceManager
在PackageManager中引入Addressables时,ResourceManager会自动包含
全部用C#编写
ResourceManager是一个用于正确管理资源加载和卸载的框架
使用引用计数执行卸载管理
DI可以定制加载过程等
它具有方便的功能,例如显示资源加载情况的分析器
可寻址资源系统与AssetBundle的区别
1.可寻址资源系统只需要一个资源的地址就可以从任意地方进行加载,而AssetBundle需要从制定bundle中加载资源。
2.可寻址资源系统加载到内存中的bundle有引用计数,而AssetBundle加载到内存中的bundle需要自己进行管理。
3.可寻址资源系统会自己管理依赖关系,而AssetBundle需要自己管理依赖关系,维护起来比较困难。
4.可寻址资源系统默认的所有加载操作都是异步操作,可以添加事件监听,而AssetBundle则有同步和异步加载。
4.Addressable系统怎么使用
1.Addressable Assets 窗口
第一次打开" Window -> Asset Management -> Addressable Assets "会需要新建一个Addressable 设置,默认资源分为两组Build In Data,Default Local Group。前者不能改动,而后者我们可以在组里进行添加和删除。我们也可以通过在Addressable Assets窗口右键再选中Create New Group-> Packed Assets来新建组。
2.标记资源
通过勾选预设/声音等资源为可寻址资源。
然后在Addressable Assets面板上就会有它选中后的状态。
目前好像还没有把一个可寻址资源文件夹下面的所有资源都自动标记为可寻址资源,还是需要手动,如果有大佬知道的话可以拿出来看下!
3.加载资源
在我们添加好可寻址资源后,就可以在代码中通过可寻址资源的地址来加载资源了。可寻址资源有3个模式可选择
Fast Mode: 快速模式:直接加载文件而不打包,快速但Profiler获取的信息较少;在此模式下,我们使用 AssetDatabase.LoadAssetAtPath 直接加载文件。虽然AssetBundle构建可以不要求立即执行的,它不能在探查证实,如果他们被列入其中AssetBundle资产。 Virtual Mode:虚拟模式:在不打包的情况下模拟靠近AssetBundle的操作;与FastMode不同,您可以查看哪个AssetBundle包含资产。此模式最终还加载了AssetDatabase.LoadAssetAtPath 。虽然AssetBundle构建是没有必要的,第一为了构建AssetBundle和资产之间的对应关系。还可以通过设置虚拟通信速度来模拟加载时间。Packed Mode:打包模式:实际上是从AssetBundle打包和加载;在这种模式下,实际构建并加载AssetBundle。
通过key加载
void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}
private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}</pre>
我们可以直接通过 Addressables类的LoadAssetAsync接口来加载资源,参数为可寻址资源的地址。通过监听事件,在加载完成后完成实例化。
Addressables.InstantiateAsync("Cube");
我们也可以直接通过Addressables类的InstantiateAsync接口来直接实例化资源。
通过AssetReference加载
该AssetReference类提供了一个机制来访问的资产,而不需要知道的字符串(或其他方式)的地址。
要使用*AssetReference 类访问可寻址资产:
我们在继承自monobehaviour的脚步中添加一个成员:
public AssetReference ar;
然后在该脚本组件的视图中就可以选择可寻址资产了。
这样我们就无需知道该可寻址资源的地址也可以直接加载它。
我们也可以通过继承AssetReference直接通过组件来加载资源。详细方法可参考官方案例:
https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/ComponentReference
4.可寻址资产系统的加载
游戏对象实例化要加载,使用Addressables.InstantiateAsync
。这将实例化传入指定的预制件location
。Addressables将加载Prefab及其依赖项,在该加载期间递增所有项的引用计数。InstantiateAsync
在同一地址上调用三次将导致所有依赖资产的ref-count为3。LoadAssetAsync
调用三次则不同,每次InstantiateAsync
呼叫都会AsyncOperationHandle
指向一个独特的操作。这是因为每个结果InstantiateAsync
都是一个唯一的实例。InstantiateAsync
和其他加载调用之间的另一个区别是可选参数trackHandle
。如果将其设置为false,则必须保留AsyncOperationHandle
在发布实例期间使用它。这样更有效,但需要游戏开发人员付出更多努力。
游戏对象实例化要卸载,使用Addressables.ReleaseInstance
或关闭实例化对象所在的场景。此场景可能已加载(因此已关闭)Additive
或Single
模式。此场景也可以通过Addressables或SceneManagement加载。如上所述,如果设置trackHandle
为false,则只能Addressables.ReleaseInstance
使用句柄调用,而不能使用实际的GameObject 调用。
关于以下内容的注释Addressables.ReleaseInstance
:如果您调用Addressables.ReleaseInstance
的是未通过可寻址创建的实例,或者使用trackHandle = false创建的实例,我们会检测Addressables.ReleaseInstance
到该实例并返回false以指示它无法释放传递给它的实例。
Addressables.InstantiateAsync
有一些与之相关的开销,所以如果你需要每帧100次实例化相同的对象,你应该考虑通过Addressables加载,然后实例化外部的Addressables。在这种情况下,您可以调用Addressables.LoadAssetAsync
,然后保存结果,并调用GameObject.Instantiate()
该结果。这使您可以灵活地以同步方式调用Instantiate。缺点是我们不知道你创建了多少个实例。如果你打电话时还有漂浮的实例Addressables.Release
,你可能会陷入糟糕的境地。例如,引用纹理的预制件将不再具有要引用的有效(加载)纹理,从而导致渲染问题(或更糟)。由于我们可能无法立即触发内存卸载(请参阅下面的“清除内存时”),因此很难跟踪这些类型的问题。
5.可寻址资产系统的Profiler
Window -> Asset Management -> Resource Profiler 打开。
此窗口的目的是向您显示所有Addressables System操作的引用计数的状态。这些操作包括资产包加载,资产加载等。
白色垂直线表示发生加载请求的帧。
蓝色背景表示当前加载了有问题的资产。
图表的绿色部分表示当前的重新计数。
以上就是我对可寻址资产系统的初步了解了。
我对addressable和ab做了更详细的对比,有兴趣的可以打开下面的文章
Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比 //www.greatytc.com/p/8009c16fcab3
参考了以下文章:https://blog.csdn.net/u010019717/article/details/81146982
https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/index.html
Unity官方可寻址资产系统案例:https://github.com/Unity-Technologies/Addressables-Sample