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

24 篇文章 1 订阅

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<T>,使用泛型的AsyncOperationHandle结构体有助于在AsyncOperationHandle.CompletedAsyncOperationHandle.Result进行类型的检查。

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

关于AsyncOperationHandleAsyncOperationHandle<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)

章节信息

参考资料

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值