关注

Unity异步编程神器:UniTask完全入门教程

什么是UniTask?

UniTask是专为Unity优化的高性能异步编程库,完美替代C#原生的async/await和Coroutine。

为什么选择UniTask?

  • ⚡ 零GC分配,性能远超Coroutine
  • 🎯 完整的async/await语法支持
  • 🔄 与Unity生命周期完美集成
  • 📦 体积小巧,易于使用

1. 安装UniTask

方式一:通过UPM安装(推荐)

  1. 打开Unity,选择 WindowPackage Manager
  2. 点击左上角 + 按钮
  3. 选择 Add package from git URL
  4. 输入:
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask

方式二:通过manifest.json安装

编辑 Packages/manifest.json,添加:

{
   
   
  "dependencies": {
   
   
    "com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask"
  }
}

方式三:下载UnityPackage

  1. 访问:https://github.com/Cysharp/UniTask/releases
  2. 下载最新的 .unitypackage 文件
  3. 在Unity中导入

2. 基础使用

2.1 引入命名空间

using Cysharp.Threading.Tasks;
using UnityEngine;

2.2 第一个UniTask示例

public class UniTaskExample : MonoBehaviour
{
   
   
    async void Start()
    {
   
   
        await DelayedMessage();
        Debug.Log("延迟消息已完成");
    }
    
    async UniTask DelayedMessage()
    {
   
   
        Debug.Log("开始等待...");
        await UniTask.Delay(2000); // 等待2秒(毫秒)
        Debug.Log("等待结束!");
    }
}

2.3 对比Coroutine

使用Coroutine:

IEnumerator LoadData()
{
   
   
    yield return new WaitForSeconds(1f);
    // 加载数据
    yield return StartCoroutine(LoadMore());
    // 使用数据
}

使用UniTask:

async UniTask LoadData()
{
   
   
    await UniTask.Delay(1000);
    // 加载数据
    await LoadMore();
    // 使用数据
}

3. 核心API详解

3.1 延迟操作

// 延迟指定毫秒数
await UniTask.Delay(1000);

// 延迟指定秒数(使用TimeSpan)
await UniTask.Delay(TimeSpan.FromSeconds(1.5f));

// 延迟一帧
await UniTask.Yield();

// 延迟N帧
await UniTask.DelayFrame(10);

// 延迟到下一帧(NextFrame)
await UniTask.NextFrame();

3.2 等待Unity对象

// 等待AsyncOperation完成
async UniTask LoadSceneAsync()
{
   
   
    var operation = SceneManager.LoadSceneAsync("NextScene");
    await operation; // 自动转换为UniTask
    Debug.Log("场景加载完成");
}

// 等待WWW请求
async UniTask DownloadData()
{
   
   
    var www = UnityWebRequest.Get("https://api.example.com/data");
    await www.SendWebRequest();
    
    if (www.result == UnityWebRequest.Result.Success)
    {
   
   
        Debug.Log(www.downloadHandler.text);
    }
}

// 等待ResourceRequest
async UniTask LoadAssetAsync()
{
   
   
    var request = Resources.LoadAsync<GameObject>("Prefab");
    var asset = await request;
    Instantiate(asset as GameObject);
}

3.3 取消操作

using System.Threading;

public class CancellableTask : MonoBehaviour
{
   
   
    private CancellationTokenSource cts;
    
    void Start()
    {
   
   
        cts = new CancellationTokenSource();
        
        // 启动可取消的任务
        LongRunningTask(cts.Token).Forget();
    }
    
    async UniTaskVoid LongRunningTask(CancellationToken token)
    {
   
   
        try
        {
   
   
            for (int i = 0; i < 10; i++)
            <

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/hyzlovezx/article/details/153273865

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--