以下是 UniTask 中各类 Wait 相关方法的系统性总结,按使用场景分类,包含核心功能、关键参数和典型用途:
一、条件等待(基于布尔条件)
| 方法 |
核心功能 |
适用场景 |
关键特点 |
WaitUntil |
等待条件为 true 时结束等待 |
等待目标状态达成(如进度满、按钮点击) |
条件满足则继续,侧重“等待出现” |
WaitWhile |
等待条件为 false 时结束等待 |
等待当前状态结束(如加载中、敌人存活) |
条件成立则等待,侧重“等待消失” |
二、时间等待(基于时间长度)
| 方法 |
核心功能 |
适用场景 |
关键参数/特点 |
UniTask.Delay |
等待指定毫秒数 |
精确时间等待(支持实时/缩放时间) |
- 单位:毫秒 - DelayType: - DeltaTime(受 Time.timeScale 影响) - RealTime(不受暂停影响) |
UniTask.WaitForSeconds |
等待指定秒数(等价于 Unity 原生 WaitForSeconds) |
简单秒级等待(受时间缩放影响) |
单位:秒,与 Delay(秒数*1000) 效果类似 |
三、帧与更新时机等待(基于游戏循环)
| 方法 |
核心功能 |
适用场景 |
对应 Unity 原生类型 |
UniTask.Yield |
等待当前帧结束,下一帧继续 |
每帧更新逻辑(如动画帧刷新) |
yield return null |
UniTask.WaitForEndOfFrame |
等待当前帧渲染结束 |
帧末操作(如截图、UI 最终布局) |
WaitForEndOfFrame |
UniTask.WaitForFixedUpdate |
等待下一次 FixedUpdate 调用 |
物理相关逻辑(如刚体受力、碰撞检测) |
WaitForFixedUpdate |
四、对象/组件生命周期等待(基于对象状态)
| 方法 |
核心功能 |
适用场景 |
关键参数 |
UniTask.WaitUntilDestroyed |
等待目标对象被销毁后继续 |
监听对象生命周期(如敌人死亡、道具消失) |
传入 UnityEngine.Object(如 GameObject、Component) |
UniTask.WaitWhileActive |
等待对象/组件从激活变为禁用 |
监听激活状态结束(如面板关闭) |
传入 MonoBehaviour 或 GameObject |
UniTask.WaitUntilActive |
等待对象/组件从禁用变为激活 |
监听激活状态开始(如面板打开) |
同上 |
五、多任务等待(基于多个异步操作)
| 方法 |
核心功能 |
适用场景 |
与 Task 类比 |
UniTask.WhenAll |
等待多个 UniTask 全部完成后继续 |
并行任务(如多资源加载) |
类似 Task.WhenAll |
UniTask.WhenAny |
等待多个 UniTask 中任意一个完成后继续 |
竞争任务(如多下载源取最快结果) |
类似 Task.WhenAny |
六、属性变化等待(基于值变更)
| 方法 |
核心功能 |
适用场景 |
依赖条件 |
UniTask.WaitForFirstValueChanged |
等待目标对象的指定属性首次变化 |
监听数据变更(如分数、血量、配置更新) |
目标对象需实现 INotifyPropertyChanged 或支持属性监听 |
总结表
| 分类 |
核心方法 |
核心逻辑概括 |
| 条件等待 |
WaitUntil / WaitWhile |
基于布尔条件的“等出现”/“等消失” |
| 时间等待 |
Delay / WaitForSeconds |
基于毫秒/秒的时间间隔等待 |
| 帧时机等待 |
Yield / WaitForEndOfFrame / WaitForFixedUpdate |
基于游戏循环的帧内/帧间时机 |
| 对象生命周期 |
WaitUntilDestroyed / WaitWhileActive |
基于对象销毁/激活状态的等待 |
| 多任务协同 |
WhenAll / WhenAny |
多个异步任务的“全完成”/“任一完成”等待 |
| 属性变化 |
WaitForFirstValueChanged |
监听属性值首次变更的等待 |
通过这些方法,可覆盖游戏开发中几乎所有异步等待场景,相比 Unity 原生协程更简洁、高效,且支持 async/await 语法,大幅提升代码可读性。