利用await/async 与 Task 关键词替换协程功能

Intro

参考视频:# Unity async / await: Coroutine’s Hot Sister [C# & Unity]

协程是Unity提供的异步解决方法,但是实际应用时有诸多不便与不优雅之处。本文将用几个例子对比参照协程与await/async关键字。当然,Unity指出,在Unity中写多线程代码应当参考Unity - Manual: C# Job System

旧例

利用协程转动三个物体,并使得这三个物体逐个停止。

给出下列协程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Collections;
using UnityEngine;

public class Shape: MonoBehaviour()
{
public IEnumerator RotateForSeconds(float duration)
    {
    var end = Time.time + duration;
    while(Time.time < end)
    {
    transform.Rotate(new Vector3(1,1)*Time.deltaTime*150;
    yield return null;
    }
    }
}

给出下列调用协程的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Collections;
using UnityEngine;

public class ShapeManager: MonoBehaviour()
{
[SerializeField] private Shape[] _shapes;

public void BeginTest()
{
for(var i = 0; i<_shapes.Length;i++)
{
StartCoroutine(_shapes[i].RotateForSeconds(1+1*i);
}
}
}