16.异步加载资源的几种方式

16.其他_资源加载相关_异步加载的几种使用方式


16.1 知识点

回顾目前动态异步加载的使用方式

asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
//通过事件监听的方式 结束时使用资源
asyncOperationHandle.Completed += (obj) =>
{
    if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
    {
        print("事件创建对象");
        Instantiate(obj.Result);
    }
};

3种使用异步加载资源的方式

  1. 事件监听(目前学习过的)
  2. 协同程序
  3. 异步函数(async和await)

通过协程使用异步加载

AsyncOperationHandle.IsDone handle资源是否加载成功

IEnumerator LoadAssetCoroutine()
{
    //asyncOperationHandle继承IEnumerator接口
    asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
    
    //要判断这个handle是否加载成功
    //因为有可能资源已经异步加载过了,handle已经是加载完了的 不然的话加载完了还 yield return后面的内容不会执行
    //所以一定是没有加载成功再去yield return
    if (!asyncOperationHandle.IsDone)
        yield return asyncOperationHandle;

    //加载成功 那么久可以使用了
    if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
    {
        print("协同程序创建对象");
        Instantiate(asyncOperationHandle.Result);
    }
    else
        Addressables.Release(asyncOperationHandle);
}
StartCoroutine(LoadAssetCoroutine());

通过异步函数async和await加载

async void LoadAssetTaskSingle()
{
    asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");

    //单任务等待
    await asyncOperationHandle.Task;
    print("异步函数的形式单任务等待加载的资源");
    Instantiate(asyncOperationHandle.Result);
}

async void LoadAssetTaskMulti()
{
    asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
    AsyncOperationHandle<GameObject> sphereAsyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Sphere");

    //多任务等待 所有任务完成后再执行后面的代码
    await Task.WhenAll(asyncOperationHandle.Task, sphereAsyncOperationHandle.Task);

    print("异步函数的形式多任务等待加载的资源");
    Instantiate(asyncOperationHandle.Result);
    Instantiate(sphereAsyncOperationHandle.Result);
}
//注意:WebGL平台不支持异步函数语法

//单任务等待
LoadAssetTaskSingle();
//多任务等待
LoadAssetTaskMulti();

16.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class Lesson16_其他_资源加载相关_异步加载的几种使用方式 : MonoBehaviour
{
    AsyncOperationHandle<GameObject> asyncOperationHandle;

    void Start()
    {
        #region 知识点一 回顾目前动态异步加载的使用方式

        // asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
        // //通过事件监听的方式 结束时使用资源
        // asyncOperationHandle.Completed += (obj) =>
        // {
        //     if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
        //     {
        //         print("事件创建对象");
        //         Instantiate(obj.Result);
        //     }
        // };

        #endregion

        #region 知识点二 3种使用异步加载资源的方式

        //1.事件监听(目前学习过的)
        //2.协同程序
        //3.异步函数(async和await )

        #endregion

        #region 知识点三 通过协程使用异步加载

        // StartCoroutine(LoadAssetCoroutine());

        #endregion

        #region 知识点四 通过异步函数async和await加载

        //注意:WebGL平台不支持异步函数语法

        //单任务等待
        LoadAssetTaskSingle();
        //多任务等待
        LoadAssetTaskMulti();

        #endregion
    }

    IEnumerator LoadAssetCoroutine()
    {
        //asyncOperationHandle继承IEnumerator接口
        asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");

        //要判断这个handle是否加载成功
        //因为有可能资源已经异步加载过了,handle已经是加载完了的 不然的话加载完了还 yield return后面的内容不会执行
        //所以一定是没有加载成功再去yield return
        if (!asyncOperationHandle.IsDone)
            yield return asyncOperationHandle;

        //加载成功 那么久可以使用了
        if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
        {
            print("协同程序创建对象");
            Instantiate(asyncOperationHandle.Result);
        }
        else
            Addressables.Release(asyncOperationHandle);
    }

    async void LoadAssetTaskSingle()
    {
        asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");


        //单任务等待
        await asyncOperationHandle.Task;
        print("异步函数的形式单任务等待加载的资源");
        Instantiate(asyncOperationHandle.Result);
    }

    async void LoadAssetTaskMulti()
    {
        asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");

        AsyncOperationHandle<GameObject> sphereAsyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Sphere");


        //多任务等待 所有任务完成后再执行后面的代码
        await Task.WhenAll(asyncOperationHandle.Task, sphereAsyncOperationHandle.Task);

        print("异步函数的形式多任务等待加载的资源");
        Instantiate(asyncOperationHandle.Result);
        Instantiate(sphereAsyncOperationHandle.Result);
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏