🧠 为什么你应该使用 UniTask?
Unity 原生的协程(Coroutine)太原始,写法难以维护、缺少返回值,写异步逻辑一不小心就像在写意大利面代码。
尝试用 async/await
?C# 的 Task
太“重”了,会频繁触发 GC,在移动端和微信小程序这类内存敏感的平台上很容易造成性能波动甚至崩溃。
UniTask 就是为此而生的:
- ✅ 支持 async/await,但几乎 不产生 GC
- ✅ 完全兼容 Unity 的生命周期和主线程
- ✅ 在 WebGL、微信小程序等 IL2CPP 环境下稳定运行
🚀 安装 UniTask 到 Unity 项目(推荐方法)
方法一:使用 OpenUPM(推荐)
- 安装 OpenUPM CLI(仅需一次):
bash复制编辑npm install -g openupm-cli
- 在 Unity 项目的根目录中打开终端,执行:
bash复制编辑openupm add com.cysharp.unitask
安装完成后,Unity 会自动生成一个 Packages/com.cysharp.unitask
目录。
方法二:使用 Git URL(无需命令行)
- 打开 Unity 编辑器
- 依次点击:Window > Package Manager
- 点击左上角 ➕ 号 > 选择 Add package from git URL
- 输入地址:
arduino复制编辑https://github.com/Cysharp/UniTask.git?path=UnityPackage/UniTask
点击 Add 即可。
方法三:手动导入源码(不推荐,易出错)
从 UniTask GitHub 仓库 下载代码后,复制 UnityPackage/UniTask/Runtime
到你项目的 Assets/Plugins/UniTask
目录下。
缺点:需手动管理依赖和更新,不推荐新手使用。
🔧 安装后配置检查(避免踩坑)
- 打开 Unity 的 Player Settings
- 找到 Api Compatibility Level,推荐设置为 .NET Standard 2.1
- 若发布微信小程序/WebGL,确保启用了 IL2CPP 和 Strip Engine Code
✅ 基础用法:Hello UniTask
csharp复制编辑using Cysharp.Threading.Tasks;
public class UniTaskExample : MonoBehaviour
{
private async void Start()
{
Debug.Log("Before delay");
await UniTask.Delay(1000);
Debug.Log("After delay");
}
}
非常像 C# 的 async/await,但 不会创建托管 Task 对象,性能非常高。
📦 实战案例:异步加载资源(结合 YooAsset)
假设你使用 YooAsset 管理资源:
csharp复制编辑public async UniTask<GameObject> LoadPrefabAsync(string location)
{
var handle = YooAssets.LoadAssetAsync<GameObject>(location);
await handle.ToUniTask(); // 转为 UniTask 等待加载完成
return handle.AssetObject as GameObject;
}
配合微信小程序等环境非常高效,不会阻塞主线程。
⚙️ 高级技巧(推荐收藏)
1️⃣ 添加取消令牌:防止页面关闭时任务悬空
csharp复制编辑CancellationTokenSource cts = new();
await UniTask.Delay(3000, cancellationToken: cts.Token);
// 在关闭 UI 或销毁对象时调用 cts.Cancel();
2️⃣ 限时等待:
csharp复制编辑await UniTask.Timeout(TimeSpan.FromSeconds(3));
3️⃣ 同步等待多个任务:
csharp复制编辑await UniTask.WhenAll(TaskA(), TaskB());
🧪 性能对比:UniTask vs Task vs Coroutine
特性 | Coroutine | Task | UniTask |
---|---|---|---|
返回值 | ❌ 无 | ✅ 支持 | ✅ 支持 |
堆分配 | 中 | 高(GC多) | 极低 |
异常捕获 | ❌ 不便 | ✅ 支持 | ✅ 支持 |
取消支持 | ❌ 手动 | ✅ 内建 | ✅ 内建 |
支持平台 | Unity全平台 | IL2CPP可能异常 | ✅ IL2CPP稳如狗 |
🌐 官方仓库地址 & 文档
- 🔗 GitHub 仓库:https://github.com/Cysharp/UniTask
- 📚 官方文档:仓库内的 README 和 Samples 即为最权威的文档
- 📦 OpenUPM: https://openupm.com/packages/com.cysharp.unitask/
🧩 总结
UniTask 是现代 Unity 异步编程的未来。它兼具 性能 与 可读性,并对 IL2CPP、微信小程序、WebGL 等平台提供原生适配,是协程和原生 Task
的最佳替代方案。
一句话总结:UniTask 让 Unity 异步开发变得优雅、高效、可控。