不想再配改那些狗屎路径,准备研究一下Adressable,据说可以用key加载指定的资源
刚安装下来,随便搞了个资源勾选了一下addressable的框框,多了好多东西啊
概念铺天盖地而来,ok 没事的 慢慢来!
前置知识
Package Manager安装
Resources加载
AssetBundle加载
Unity 2021.3.34
插件版本 1.21.17
如果跟我一样的Unity版本,大概率直接搜,会安装到1.19.19 这个版本编辑器会报错
在左边加号选择AddPackage by Name 安装更新的版本
分别输入
com.unity.addressables
1.21.17
安装后,可以一起安装一下示例
PrefabSpawner
加载资源
就从最基础的动态加载资源开始!
加载入参
有四种输入可以加载,文档统一叫做Key
- Address 就是勾选之后,输入框的内容
- Label 标签
这两个就没见过了,下一篇说 - AssetReference object :AssetReference的实例(好像是废话
- IResourceLocation instance 包含加载资产及其依赖项的信息的中间对象。(?)
文档提到可以打开日志查看报错信息, Log Runtime Exceptions
最开头随便勾选了一个Addressable之后,多了很多文件
肯定在一个什么设置或者配置里 Settings or Config咯
AddressableAssetSettings
看来是默认勾选了
加载单个资源
先搞一个资源,创建个预制体,Inspector最上面勾选Addressable
勾选后,输入框会输入地址,可以在这里改名或者点击Select,找到这个资源右键简化名称
可以看到默认分了一个组 Default Local Group,这就是未来打包的时候,同一个组里的资源会打在一个AB包里
创建脚本,场景,把脚本找个地方挂上去,把刚刚写的TestCube填写到Key里,运行可以加载出来就没问题啦。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class LoadAddress : MonoBehaviour
{
public string key;
AsyncOperationHandle<GameObject> opHandle;
public IEnumerator Start()
{
//也可以用label
opHandle = Addressables.LoadAssetAsync<GameObject>(key);
//同步
//GameObject obj = opHandle.WaitForCompletion();
yield return opHandle;
if (opHandle.Status == AsyncOperationStatus.Succeeded)
{
GameObject obj = opHandle.Result;
Instantiate(obj, transform);
}
}
void OnDestroy()
{
//这里也可以用游戏对象释放
Addressables.Release(opHandle);
}
}
Addressables下的加载都是异步的,同步方法全部标记过时,这里是使用协程的方式等待加载结束
同步的方式:https://docs.unity3d.com/Packages/com.unity.addressables@1.21/manual/SynchronousAddressables.html
op.WaitForCompletion();
注意限制:
- WebGL不支持,wait的做法就是在主循环等待,其他线程加载,而Web只有单线程
- 加载场景虽然可以用这个方法,但不是真正的完成,还是得异步激活完毕
PS:
- 如果有多个资源设置同一个Address,并不会报错,说明它是允许一个Address关联多个资源的,如果只想关联一个,可能需要自己实现查重工具
- Label和Address可以同名,但是我觉得最好不要
- 资源可以有多个Label
多个资源加载
https://docs.unity3d.com/Packages/com.unity.addressables@1.21/manual/load-addressable-assets.html
链接第二个例子,我就不抄代码了。
主要是MergeMode
-
Union: Include assets that match any key
有一个输入匹配上的就加到结果里 -
Intersection: Include assets that match every key
所有输入都匹配上才能加入
如果传的是多个Address就没用,资源只有一个Address
label就可以多个,一个资源可以有多个label -
UseFirst: Include assets only from the first key that resolves to a valid location
看起来就是返回第一个有用的key的资源,可能是有多个版本的情况会用吧
最后一个参数 releaseDependenciesOnFailure
true 就是加载多个资源,如果有一个失败,就全都释放掉,包括成功的资源。适合需要完整加载的情况
false 就是可以获得所有成功的资源,但是结果判断还是取决于所有的资源是否都成功