U4S4L16——关于Async Operation Handle
U4S4L16——关于Async Operation Handle
本章代码关键字
1 | asyncOperationHandle<>.GetDownloadStatus() //获取当前下载状态的结构体 |
获取加载进度
我们通过调用AsyncOperationHandle<>.GetDownloadStatus()
来获取当前打印状态,返回的是DownloadStatus
结构体数据
通过该结构体我们可以获取到Percent
加载进度(0~1
),DownloadedBytes
加载字节数,TotalBytes
总字节数
注意:如果该资源相关的AB包已经加载过了,那么只会打印0
1 | void Start() |
无类型句柄转换
无类型句柄指的是AsyncOperationHandle
,它不携带类型信息
它在内部通过implicit operator
重载了隐式转换,使得AsyncOperationHandle<>
可以隐式转换为AsyncOperationHandle
重载了隐式转换运算符的具体用法详见:用户定义的显式和隐式转换运算符 - 提供对不同类型的转换 - C# reference | Microsoft Learn
1 | //AsyncOperationHandle内部 |
我们可以将异步加载方法Addressables.LoadAssetAsync<>()
返回的AsyncOperationHandle<>
隐式转换为AsyncOperationHandle
之后在将无类型的AsyncOperationHandle
转换为有类型的AsyncOperationHandle<>
1 | void Start() |
这种有类型句柄可转换为无类型句柄的特性,可用于统一管理加载出来的不同资源
我们可以使用无类型的AsyncOperationHandle
容器来装载不同泛型类型的AsyncOperationHandle<>
数据
这样,我们不需要使用AsyncOperationHandle<>
的父类或者接口的容器去统一的装载AsyncOperationHandle<>
数据
方便我们对各种AsyncOperationHandle<>
数据执行一些不涉及资源类型信息的操作,例如卸载等
1 | public Dictionary<string, AsyncOperationHandle> resDic = new Dictionary<string, AsyncOperationHandle>(); |
强制同步加载资源
如果执行了WaitForCompletion()
,那么会阻塞主线程,一定要当资源加载结束后,才会继续往下执行
注意:如无特殊需求,不建议使用该方法
1 | void Start() |
注意:
Unity2020.1版本或者之前,执行该句代码不仅会等待该资源,他会等待所有没有加载完成的异步加载加载完后才会继续往下执行
Unity2020.2版本或以上版本,在加载已经下载的资源时性能影响会好一些
所以,总体来说不建议大家使用这种方式加载资源