1.概述
1.1 知识点
UniTask 是什么
UniTask 是专为 Unity 设计的高性能、零 GC 的 async/await
异步解决方案。它优化了传统的异步编程方式,解决了 Unity 协程与 C# 原生 Task 的不足,为开发者提供了更高效、简洁的异步开发体验。
为什么要使用 UniTask?
协程的缺点:
- 依赖
Monobehaviour
- 无法进行异常处理
- 方法返回值获取困难
C# 原生 Task:
- 优点:
- 不依赖
Monobehaviour
- 支持异常处理
- 不依赖
- 缺点:
- Task 消耗大,涉及跨线程操作
核心特性
零堆内存分配
基于值类型的UniTask<T>
与自定义的AsyncMethodBuilder
实现零 GC 开销。支持 Unity 异步对象
使所有 Unity 的AsyncOperation
与Coroutine
均可直接await
。基于 PlayerLoop 任务
如UniTask.Yield
、UniTask.Delay
、UniTask.DelayFrame
等方法可替换传统协程操作,且无需线程支持,可在 WebGL、wasm 等平台上运行。丰富的异步扩展
对 MonoBehaviour 消息事件、uGUI 事件提供可等待/异步枚举扩展;并内置 Channel 与 AsyncReactiveProperty 支持异步 LINQ。内置工具支持
提供 TaskTracker EditorWindow 以追踪所有 UniTask 分配,帮助预防内存泄漏。
相关博客文章:
GitHub 地址:https://github.com/Cysharp/UniTask
常见 API
延时操作
- Delay
- DelayFrame
- Yield
- NextFrame
- WaitForEndOfFrame
等待操作
- Wait Until
- Wait Until Value Changed
条件操作
- When All
- When Any
异步委托生成 UniTask 及相关封装
- UniTask.Void
- UniTask.Defer
- UniTask.Lazy
UniTask 对部分 Unity 对象的扩展
- 异步操作的等待(协程)
- UGUI 方法的等待(进阶)
- Monobehaviour 的等待(进阶)
取消
- 两种方式:
- 创建
CancellationToken
- 使用
GameObject
的GetCancellationTokenOnDestroy()
- 创建
异常处理
- Try Catch
- SuppressCancellationThrow
超时处理
通过 CancellationTokenSouce.CancelAfterSlim(TimeSpan)
设置超时,将 CancellationToken
传递给异步方法。
补充:async void 与 async UniTaskVoid 对比
Forget()
事件处理
- 异步事件通过 Lambda 表达式注册,使用
UniTask.Action
或UniTask.UnityAction
- UGUI 事件转换为可等待事件:
AsAsyncEnumerable
MonoBehaviour
消息事件转换为异步流
异步 Linq
异步迭代器
响应式组件
安装UniTask
版本要求
确保您的 Unity 版本支持 Git 包路径查询参数:
- Unity >= 2019.3.4f1
- Unity >= 2020.1a21
在 Package Manager 中安装
在 Unity 的 Package Manager 中添加以下链接即可安装:
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
或在 manifest 文件中添加依赖
您也可以手动编辑 Packages/manifest.json
文件,添加如下内容:
{
"dependencies": {
"com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask"
}
}
指定版本安装
UniTask 使用 *.*.*
发布标签来指定版本。如果需要安装指定版本,可在链接后附加版本标签。例如,要安装 2.1.0 版本,可使用以下链接:
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.1.0
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com