Unity实现异步的三种方法

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学习笔记

相关推荐
zhchyun20089 小时前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(05)
ui·unity·游戏引擎
_ZHOURUI_H_12 小时前
不做完整 ECS,只优化数据布局:Unity EasyECS 到底是什么
unity·性能优化·游戏引擎
郝学胜-神的一滴2 天前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
江上闲人.2 天前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
小贺儿开发2 天前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com2 天前
Unity UniText笔记
unity·unitext
杨丰玮4182 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技3 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui3613 天前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎