Addressable Asset System可寻址资源系统-第八章 AsyncOperationHandle详解

Addressable Asset System可寻址资源系统-第八章 AsyncOperationHandle详解

简介

Addressable的很多方法被调用后都会返回一个AsyncOperationHandle的结构体,可以得到当前的状态和结果。在没有调用Addressables.ReleaseAddressables.ReleaseInstance前,AsyncOperationHandle是一直有效的,包括其Status与Result中的值。

当操作结束后,通过访问Status字段可以得知操作成功与否,其结果值有AsyncOperationStatus.SucceededAsyncOperationStatus.Failed,只有当状态为Successed时才能访问Result的值。

在实际使用中想要得到操作的结果可以通过实时检测AsyncOperationHandle的状态值或者通过添加的回调AsyncOperationHandle.Complete来完成

在AsyncOperationHandle所包含的资源不再使用后,需要调用Addressables.Release进行释放详细的情况可以参考Memory Managerment.

带类型与不带类型的AsyncOperationHandle

Addressables大部分的API在被调用后都会返回一个泛型的AsyncOperationHandle结构体AsyncOperationHandle,使用泛型的AsyncOperationHandle结构体有助于在AsyncOperationHandle.CompletedAsyncOperationHandle.Result进行类型的检查。

其实AsyncOperationHandle还有一个不是泛型的结构体,在运行时两者可以相互转换,不过前提是两者所对应的类型信息必须是一致的,否则会提示错误信息。

关于AsyncOperationHandleAsyncOperationHandle的转换举个例子。

AsyncOperationHandle textureHandle = Addressables.LoadAssetAsync("mytexture");
//将AsyncOperationHandle转换为AsyncOperationHandle
AsyncOperationHandle nonGenericHandle = textureHandle;

//将AsyncOperationHandle转换为AsyncOperationHandle,由于两者类型是相同的,所以转换是可以完成的
AsyncOperationHandle textureHandle2 = nonGenericHandle.Convert();

//nonGenericHandle中类型为Texture2D,textureHandle3中的类型为Texture,两者无法转换。
//即使Texture2D继承自Texture
AsyncOperationHandle textureHandle3 = nonGenericHandle.Convert();

如何使用AsyncOperationHandle

  • 通过添加Completed回调函数

    
    private void TextureHandle_Completed(AsyncOperationHandle handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Texture2D result = handle.Result;
        }
    }
    
    void Start()
    {
        AsyncOperationHandle textureHandle = Addressables.LoadAsset("mytexture");
        textureHandle.Completed += TextureHandle_Completed;
    }
    
    
  • 使用协程

    由于AsyncOperationHandle实现了接口IEnumerator,所以我们可以使用协程

    
    public IEnumerator Start()
    {
        AsyncOperationHandle handle = Addressables.LoadAssetAsync("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 handle = Addressables.LoadAssetAsync("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详解(未完待续)

参考资料

  • Addressable Asset System官方文档

你可能感兴趣的:(Addressable Asset System可寻址资源系统-第八章 AsyncOperationHandle详解)