Skip to content
On this page

Unity UniTask

什么是UniTask?

UniTask是Unity中一个强大的异步/等待(Async/Await)解决方案,它比传统的协程(Coroutine)更高效、更灵活。UniTask基于C#的Task异步模型,专门为Unity优化,提供了零分配(Zero Allocation)和更好的性能。

UniTask与协程的主要区别:

  • 基于C#原生async/await语法
  • 更少的GC分配
  • 更好的性能
  • 更丰富的API功能
  • 支持取消操作

如何安装UniTask?

  1. 通过Unity Package Manager安装

    • 打开Window > Package Manager
    • 点击"+"按钮选择"Add package from git URL"
    • 输入:https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
  2. 或者通过OpenUPM安装

    bash
    openupm add com.cysharp.unitask
    

基础用法示例

csharp
using Cysharp.Threading.Tasks;
using UnityEngine;

public class UniTaskExample : MonoBehaviour
{
    async UniTaskVoid Start()
    {
        // 等待1秒
        await UniTask.Delay(1000);
        Debug.Log("1秒后");
        
        // 等待下一帧
        await UniTask.NextFrame();
        Debug.Log("下一帧");
        
        // 异步加载资源
        var prefab = await Resources.LoadAsync<GameObject>("Prefab");
        Instantiate(prefab);
    }
}

实用示例:倒计时

csharp
async UniTaskVoid Countdown(int seconds)
{
    while (seconds > 0)
    {
        Debug.Log(seconds);
        await UniTask.Delay(1000);
        seconds--;
    }
    Debug.Log("倒计时结束!");
}

void Start()
{
    Countdown(5).Forget();
}

常见应用场景

  1. 异步加载资源
  2. 网络请求
  3. UI动画序列
  4. 复杂的状态机
  5. 多任务并行处理

性能优化建议

  1. 尽量使用UniTaskVoid代替UniTask作为返回类型
  2. 使用Forget()方法处理不需要等待的任务
  3. 避免在Update中频繁创建新任务
  4. 合理使用取消令牌(CancellationToken)
  5. 使用UniTask.WhenAll并行处理多个任务

与协程的对比

特性UniTask协程
语法async/awaityield return
GC分配
性能
取消支持
异常处理完善有限
并行处理支持不支持

Released under the MIT License.