Unity实现异步的三种方法
- Update
- 协程
- async/await Task
因为工作时用到了UniTask,所以就简单比较了下在Unity在实现异步时的三种方法。
Update
Update是使用Mono生命周期的Update/LateUpdate/FixedUpdate等更新方法来控制自己方法的调用时间,如下:
csharp
private void Update()
{
DoStep();
}
private int step = 1;
private float funTimeInterval;
private void DoStep()
{
if (funTimeInterval > 0)
{
funTimeInterval -= Time.deltaTime;
return;
}
switch (step)
{
case 1:
HelloWorld1();
funTimeInterval = 3;
break;
case 2:
HelloWorld2();
break;
default:
return;
}
step++;
}
上述代码就是通过Update,去让我们执行HelloWorld1之后,等待3秒,再执行HelloWorld2。
缺点: 会增加很多成员变量,让代码变得复杂,导致容易出错,扩展性不高,且依托于Monobehaviour。
协程
在协程中,可以通过Unity的语法糖来进行等待,实现功能的异步。如下:
csharp
private void Start()
{
StartCoroutine(nameof(TextCoroutine));
}
private IEnumerator TextCoroutine()
{
HelloWorld1();
yield return new WaitForSeconds(3);
HelloWorld2();
}
优点 :
1、无额外的成员变量
2、线性的代码结构让拓展性与可读性更高
缺点 :
1、消耗大:协程的本质是迭代器,在开启协程时,会实例化一个接口对象。
2、无法进行异常的处理
3、依托于MonoBehaviour
async/await Task
我使用的是UniTask插件是Unity的高性能、0GC的async/await解决方案,它提供了与原生Task高度兼容的异步操作。。代码如下:
csharp
private async void Start()
{
// UniTask的等待是按毫秒计算的
// 等待3秒,执行HelloWorld1
await UniTask.Delay(3000);
HelloWorld1();
// 等待bar加载完成,执行HelloWorld2
var asset2 = await Resources.LoadAsync<TextAsset>("bar");
HelloWorld2();
}
优点 :
1、代码的拓展性与可读性更高
2、可以进行异常的处理
3、0GC
4、丰富的 API 集,提供附加功能
总的来说,如果对于性能消耗有要求,且对于异步的处理有要求的开发同学,用UniTask进行开发是一个很不错的选择。
参考链接:
协程参考链接
UniTask的Gitee地址
UniTask学习笔记