Addressable Asset System可寻址资源系统-第八章 AsyncOperationHandle详解
简介
Addressable的很多方法被调用后都会返回一个AsyncOperationHandle的结构体,可以得到当前的状态和结果。在没有调用Addressables.Release
与Addressables.ReleaseInstance
前,AsyncOperationHandle是一直有效的,包括其Status与Result中的值。
当操作结束后,通过访问Status字段可以得知操作成功与否,其结果值有AsyncOperationStatus.Succeeded
与AsyncOperationStatus.Failed
,只有当状态为Successed时才能访问Result的值。
在实际使用中想要得到操作的结果可以通过实时检测AsyncOperationHandle的状态值或者通过添加的回调AsyncOperationHandle.Complete
来完成
在AsyncOperationHandle所包含的资源不再使用后,需要调用Addressables.Release
进行释放详细的情况可以参考Memory Managerment.
带类型与不带类型的AsyncOperationHandle
Addressables大部分的API在被调用后都会返回一个泛型的AsyncOperationHandle结构体AsyncOperationHandle<T>
,使用泛型的AsyncOperationHandle结构体有助于在AsyncOperationHandle.Completed
与AsyncOperationHandle.Result
进行类型的检查。
其实AsyncOperationHandle还有一个不是泛型的结构体,在运行时两者可以相互转换,不过前提是两者所对应的类型信息必须是一致的,否则会提示错误信息。
关于AsyncOperationHandle
与AsyncOperationHandle<T>
的转换举个例子。
AsyncOperationHandle<Texture2D> textureHandle = Addressables.LoadAssetAsync<Texture2D>("mytexture");
//将AsyncOperationHandle<Texture2D>转换为AsyncOperationHandle
AsyncOperationHandle nonGenericHandle = textureHandle;
//将AsyncOperationHandle转换为AsyncOperationHandle<Texture2D>,由于两者类型是相同的,所以转换是可以完成的
AsyncOperationHandle<Texture2D> textureHandle2 = nonGenericHandle.Convert<Texture2D>();
//nonGenericHandle中类型为Texture2D,textureHandle3中的类型为Texture,两者无法转换。
//即使Texture2D继承自Texture
AsyncOperationHandle<Texture> textureHandle3 = nonGenericHandle.Convert<Texture>();
如何使用AsyncOperationHandle
-
通过添加Completed回调函数
private void TextureHandle_Completed(AsyncOperationHandle<Texture2D> handle) { if (handle.Status == AsyncOperationStatus.Succeeded) { Texture2D result = handle.Result; } } void Start() { AsyncOperationHandle<Texture2D> textureHandle = Addressables.LoadAsset<Texture2D>("mytexture"); textureHandle.Completed += TextureHandle_Completed; }
-
使用协程
由于AsyncOperationHandle实现了接口IEnumerator,所以我们可以使用协程
public IEnumerator Start() { AsyncOperationHandle<Texture2D> handle = Addressables.LoadAssetAsync<Texture2D>("mytexture"); yield return handle; if (handle.Status == AsyncOperationStatus.Succeeded) { Texture2D texture = handle.Result; // Texture ready for use... // Done. Release resource Addressables.Release(handle); } }
-
使用async await
public async Start() { AsyncOperationHandle<Texture2D> handle = Addressables.LoadAssetAsync<Texture2D>("mytexture"); await handle.Task; // Task has completed. Be sure to check the Status has succeeded before getting the Result }
声明
本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。
如果您进行转载,请标明出处。
Addressable Asset System(可寻址资源系统)-第八章 AsyncOperationHandle详解(http://www.liyubin.com/articles/2019/08/13/1565673671362.html)
章节信息
- Addressable Asset System(可寻址资源系统)-总章
- Addressable Asset System(可寻址资源系统)-第一章 简介
- Addressable Asset System(可寻址资源系统)-第二章 基本概念
- Addressable Asset System(可寻址资源系统)-第三章 开始使用
- Addressable Asset System(可寻址资源系统)-第四章 基本的设置详解(未完待续)
- Addressable Asset System(可寻址资源系统)-第五章 资源托管(未完待续)
- Addressable Asset System(可寻址资源系统)-第六章 旧系统升级指导手册
- Addressable Asset System(可寻址资源系统)-第七章 内存管理
- Addressable Asset System(可寻址资源系统)-第八章 AsyncOperationHandle详解
- Addressable Asset System(可寻址资源系统)-第九章 自定义操作(未完待续)
- Addressable Asset System(可寻址资源系统)-第十章 资源分析工具(未完待续)
- Addressable Asset System(可寻址资源系统)-第十一章 常用API详解(未完待续)