可寻址资产系统提供了一种通过“地址”加载资产的简便方法。它通过简化内容包的创建和部署来处理资产管理开销。可寻址资产系统使用异步加载来支持从任何位置加载任何依赖项集合。
一旦资产被标记为“可寻址”,就可以从任何地方调用可寻址资产。无论该可寻址资产是驻留在本地播放器还是内容传送网络上,系统都将找到并返回它。您可以通过其地址加载单个可寻址,或使用您定义的自定义组标签加载许多可寻址。
迭代时间:通过其地址引用内容是超级高效的。使用地址引用,只会检索内容。对内容的优化不再需要更改代码。
依赖关系管理:系统不仅返回地址的内容,还返回该内容的所有依赖关系。系统会在整个资产准备就绪时通知您,因此在返回内容之前会加载所有网格,着色器,动画等。
内存管理:该地址不仅可以加载资产,还可以卸载它们。引用会自动计算,强大的分析器可帮助您发现潜在的内存问题。
内容打包:由于系统映射并理解复杂的依赖关系链,因此即使在移动或重命名资产时,它也可以有效地打包捆绑包。可以为本地和远程部署轻松准备资产,以支持可下载内容(DLC)和减少应用程序大小。
我初步学习了可寻址系统后,也算是对它有了一个了解。
1.可寻址资源系统只需要一个资源的地址就可以从任意地方进行加载,而AssetBundle需要从制定bundle中加载资源。
2.可寻址资源系统加载到内存中的bundle有引用计数,而AssetBundle加载到内存中的bundle需要自己进行管理。
3.可寻址资源系统会自己管理依赖关系,而AssetBundle需要自己管理依赖关系,维护起来比较困难。
4.可寻址资源系统默认的所有加载操作都是异步操作,可以添加事件监听,而AssetBundle则有同步和异步加载。
第一次打开" Window -> Asset Management -> Addressable Assets "会需要新建一个Addressable 设置,默认资源分为两组Build In Data,Default Local Group。前者不能改动,而后者我们可以在组里进行添加和删除。我们也可以通过在Addressable Assets窗口右键再选中Create New Group-> Packed Assets来新建组。
通过勾选预设/声音等资源为可寻址资源。
然后在Addressable Assets面板上就会有它选中后的状态。
在我们添加好可寻址资源后,就可以在代码中通过可寻址资源的地址来加载资源了。可寻址资源有3个模式可选择
void Start()
{
hand = Addressables.LoadAssetAsync<GameObject>("Cube");
hand.Completed += OnResLoadedHandler;
}
private void OnResLoadedHandler(AsyncOperationHandle<GameObject> obj)
{
GameObject go = obj.Result;
Instantiate(go);
}
我们可以直接通过 Addressables类的LoadAssetAsync接口来加载资源,参数为可寻址资源的地址。通过监听事件,在加载完成后完成实例化。
Addressables.InstantiateAsync("Cube");
我们也可以直接通过Addressables类的InstantiateAsync接口来直接实例化资源。
AssetReference类提供了一个机制来访问的资产,而不需要知道的字符串(或其他方式)的地址。
要使用*AssetReference 类访问可寻址资产:
我们在继承自monobehaviour的脚步中添加一个成员:
public AssetReference ar;
然后在该脚本组件的视图中就可以选择可寻址资产了。
这样我们就无需知道该可寻址资源的地址也可以直接加载它。
我们也可以通过继承AssetReference直接通过组件来加载资源。详细方法可参考官方案例:
https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/ComponentReference
游戏对象实例化要加载,使用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,你可能会陷入糟糕的境地。例如,引用纹理的预制件将不再具有要引用的有效(加载)纹理,从而导致渲染问题(或更糟)。由于我们可能无法立即触发内存卸载(请参阅下面的“清除内存时”),因此很难跟踪这些类型的问题。
Window -> Asset Management -> Resource Profiler 打开。
此窗口的目的是向您显示所有Addressables System操作的引用计数的状态。这些操作包括资产包加载,资产加载等。
参考了以下文章:https://blog.csdn.net/u010019717/article/details/81146982
https://docs.unity3d.com/Packages/[email protected]/manual/index.html
Unity官方可寻址资产系统案例:https://github.com/Unity-Technologies/Addressables-Sample
作者:右先生zzz
转载自:https://www.jianshu.com/p/e79b2eef97bf
来源:简书