U4S4L15——异步加载的几种使用方式

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

1
2
3
4
5
6
7
8
9
10
var handle = Addressables.LoadAssetAsync<GameObject>("Cube");
//通过事件监听的方式 结束时使用资源
handle.Completed += (obj) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
print("事件创建对象");
Instantiate(obj.Result);
}
};

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

  1. 事件监听(目前学习过的)
  2. 协同程序(协程相关知识详见:协同程序)
  3. 异步函数(async​ 和 await​,详见:异步方法)

通过协程使用异步加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AsyncOperationHandle<GameObject> handle;

void Start()
{
StartCoroutine(LoadAsset());
}

IEnumerator LoadAsset()
{
handle = Addressables.LoadAssetAsync<GameObject>("Cube");
//没有加载完时才需要去挂起协程等待加载
if (!handle.IsDone)
yield return handle;
//加载成功后即可使用
if (handle.Status == AsyncOperationStatus.Succeeded)
{
print("协同程序创建对象");
Instantiate(handle.Result);
}
else
Addressables.Release(handle);
}

输出:image

通过异步函数async和await加载

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

单任务加载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
AsyncOperationHandle<GameObject> handle;

void Start()
{
//单任务加载
Load();
}

async void Load()
{
handle = Addressables.LoadAssetAsync<GameObject>("Cube");
//没有加载完时才需要去挂起异步方法等待加载
if (!handle.IsDone)
await handle.Task;
//加载成功后即可使用
if (handle.Status == AsyncOperationStatus.Succeeded)
{
print("异步方法创建对象");
Instantiate(handle.Result);
}
else
Addressables.Release(handle);
}

多任务加载:多任务加载可以使用Task.WhenAll()​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
AsyncOperationHandle<GameObject> handle;

void Start()
{
//StartCoroutine(LoadAsset());
//多任务加载
Load();
}

async void Load()
{
handle = Addressables.LoadAssetAsync<GameObject>("Cube");
AsyncOperationHandle<GameObject> handle2 = Addressables.LoadAssetAsync<GameObject>("Sphere");
await Task.WhenAll(handle.Task, handle2.Task);
//加载成功后即可使用
if (handle.Status == AsyncOperationStatus.Succeeded && handle2.Status == AsyncOperationStatus.Succeeded)
{
print("异步方法创建多个对象");
Instantiate(handle.Result);
Instantiate(handle2.Result);
}
else
Addressables.Release(handle);
}

输出:image