16.其他_资源加载相关_异步加载的几种使用方式
16.1 知识点
回顾目前动态异步加载的使用方式
asyncOperationHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
//通过事件监听的方式 结束时使用资源
asyncOperationHandle.Completed += (obj) =>
{
if (asyncOperationHandle.Status == AsyncOperationStatus.Succeeded)
{
print("事件创建对象");
Instantiate(obj.Result);
}
};
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