原本gameobject类型的引用改为AssetReference类型
InstantiateAsync()用法:
由于该方法是异步实例化,系统不会等待前一个实例化指令是否完成,因此大量实例化时不会卡住系统。但这并不代表大量实例化就不会卡住电脑。
Public AssestReference asOBJ;
asOBJ.InstantiateAsync();
设定Addressable资源:
首先,在Windows→AssestManagement→Addressable→group视窗下创建一个包体(group),在这个打开的视窗里可以专门放带有寻址式标签的资源物件。基本上,除了脚本以外的东西都可以标记为寻址式资源。
创建好包体之后,单击资源并在inspector视窗中勾选Addressable标记,勾选之后该资源也会在Addressable视窗里出现。当然,也可以把资源拖进Addressable视窗的group里让它成为寻址式资源。在Addressable视窗里也可以创建不同的包体,来分类不同类型的资源。
完成这两步之后,就可以为有AssetReference的脚本指定引用了。
LoadAssetAsync()异步加载资源:
如果声明了一个list来存放多个寻址式资源,那么当我们想通过代码加载它们并引用的时候,就会考虑使用异步加载。(不过这个list可能要手动引用一下)
(注:这个加载只是一个步骤,不需要用变量接收。)
但是,怎么知道它们已经加载完成了?官方给出了一个方法:用一个信号。
bool isLoadCompleted;
LoadAssetAsync<T>有一个叫做Completed的事件,可以挂接事件处理器。比如:LoadAssetAsync<GameObjcet>.Completed += AssetLoaded;
这样就可以知道资源什么时候加载完成了。由于加载的资源是GameObject类型,而AssetReference只是引用地址,因此这里异步加载的泛型应该用资源本身的类型,而不是用地址。
当销毁该异步加载的资源的时候,可能需要手动调用一下AssetReference的ReleaseAsset()方法来释放资源。通俗地形容这两步大概意思就是:LoadAssetAsync()是将资源从包内取出,ReleaseAsset()是把取出来的资源又放回包里去。
Addressable 视窗的 Profile
当我们想知道由寻址式实例化出来的东西是否删干净、是否会对fps有影响的时候,可以打开Addressable Profile视窗来运行观察。如果有需求,还可以自定义profile的setting,勾选Send Profile Events获得实时的profile内容(这个仅在测试时用,因为发送事件是非常消耗性能的)。详情见官方Addressable直播27:20处和34:00处内容。
Label
Label相当于寻址式资源的Tag,可以在Addressables.LoadAssetsAsync<T>(Label, Action<T> callback) (注意这是个静态方法,后面那个是回调函数,一般写null就行) 里用,但label并不是string类型,而是AssetLabelReference类型。
当使用Addressables.LoadAssetsAsync<T>(Label, Action<T> callback)这个方法来加载资源时,他会把包体内所有带有这个Label的资源都加载进来。
同样的,这个Label使用时也需要手动注册一下。
LoadResourceLocationAsync(label):Addressable物品的查询机制
由于是异步加载,可能出现一些本该在index=3的同label物品被先加载而导致它的index=1,所以为了防止这种情况的出现,可以用LoadResourceLocationAsync(label)先搜寻出所有匹配label物品并列成清单(此时不会加载,也不会实例化,只是取出一张清单),取出来的清单会被放在一个叫IResourceLocation的数组里,便可以从中获得每个清单中物品的ID。
打包
在Addressable视窗的build里有个build player content,即是打包资源的按钮。单击等待些许时间即可。
本地/远端打包设置:
Local Build/Load Path:本地端打包/加载路劲
Remote Build/Load Path:远端打包/加载路劲
这些路径可以在单击包group时出现的inspector面板里设置。
网友评论