什么是UniTask?
UniTask是专为Unity优化的高性能异步编程库,完美替代C#原生的async/await和Coroutine。
为什么选择UniTask?
- ⚡ 零GC分配,性能远超Coroutine
- 🎯 完整的async/await语法支持
- 🔄 与Unity生命周期完美集成
- 📦 体积小巧,易于使用
1. 安装UniTask
方式一:通过UPM安装(推荐)
- 打开Unity,选择
Window→Package Manager - 点击左上角
+按钮 - 选择
Add package from git URL - 输入:
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
- 访问:https://github.com/Cysharp/UniTask/releases
- 下载最新的
.unitypackage文件 - 在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



