Unity 的 UniTask 是一种用于异步编程的 C# 库,它扩展了 .NET 中的 Task 和 await/async 模式。
1. 与传统的 Task 和 async/await 模式相比,UniTask 更加轻量级,因为它不需要像 Task 一样创建和管理线程池。
2. UniTask 具有更高的性能,因为它使用了更少的内存和 CPU 资源。
3. UniTask 还提供了更多的功能,如取消和超时等功能,这些功能在传统的 Task 中并不容易实现。
==========================================
Unitask 的常见用法:
异步等待:使用 await 关键字,可以等待一个异步操作完成,这样就不需要手动处理回调或使用协程。
延迟执行:使用 UniTask.Delay 方法可以在指定的时间后执行一个操作,而不需要使用协程或计时器。
同步化操作:使用 UniTask.SwitchToMainThread 方法可以在主线程上执行一个操作,这对于访问 Unity 的组件或 API 非常有用。
迭代器:使用 UniTask.ToCoroutine 方法可以将一个 UniTask 对象转换为 IEnumerator,从而可以在协程中使用。
任务链:使用 UniTask.WhenAll 或 UniTask.WhenAny 方法可以创建一个任务链,等待多个异步操作完成后执行下一步操作。
取消任务:使用 UniTaskCancellationToken 类可以取消异步操作,这对于长时间运行的操作非常有用。
==========================================
UniTask的特点
1.UniTask是一种基于C#结构体的异步操作库,可以在Unity中使用,UniTask使用了自定义的AsyncMethodBuilder来实现零GC的目标,这使得所有Unity的异步操作和协程可以使用await语法。
3.unitask可以为 Unity 提供有效的无GC async/await集成。
4.UniTask 还提供了异步 LINQ、Channel 和 AsyncReactiveProperty 功能。
5.UniTask 提供了 TaskTracker(Task 追踪器)窗口,用于帮助开发者在运行时监视和诊断 UniTask 的内存泄漏问题。
6.UniTask 提供了对 MonoBehaviour 消息事件和 uGUI 事件的 Await/AsyncEnumerable 支持。
7.UniTask 与 .NET 标准库中的 Task、ValueTask 和 IValueTaskSource 接口具有高度的行为兼容性。
==============================================
unitask为什么可以为 Unity 提供有效的无GC async/await集成。
1.Unitask 基于 C# Task 进行开发
2.是因为Unitask 通过优化 Task 的创建和销毁过程,尽可能地减少了 Task 的 Allocation,从而减少了 GC 压力。
3.Unitask 提供了自定义的任务调度器,通过调度器的设置,可以控制任务的执行顺序、优先级和并发度等,从而更好地控制游戏的性能。
4.Unitask 针对 Unity 游戏开发场景进行了优化,比如支持 Unity 主线程的同步调用、支持 Unity 协程的嵌套和调用、支持对 Unity 对象的操作和回收等。
=============================================
• UniTask.OnAnimatorIKAsync(int layerIndex): 当 Animator 执行 IK 动画时调用。
• UniTask.OnAnimatorMoveAsync(): 当 Animator 更新物体的 transform 时调用。
• UniTask.OnApplicationFocusAsync(bool hasFocus): 当应用程序获得或失去焦点时调用。
• UniTask.OnApplicationPauseAsync(bool pauseStatus): 当应用程序暂停或恢复时调用。
• UniTask.OnApplicationQuitAsync(): 当应用程序退出时调用。
• UniTask.OnAudioFilterReadAsync(float[] data, int channels): 当 AudioSource 读取音频数据时调用。
• UniTask.OnBecameInvisibleAsync(): 当该对象从相机视野中消失时调用。
• UniTask.OnBecameVisibleAsync(): 当该对象进入相机视野时调用。
• UniTask.OnCollisionEnterAsync(Collision collision): 当该对象与另一个对象发生碰撞时调用。
• UniTask.OnCollisionExitAsync(Collision collision): 当该对象与另一个对象碰撞结束时调用。
• UniTask.OnCollisionStayAsync(Collision collision): 当该对象与另一个对象持续碰撞时调用。
• UniTask.OnControllerColliderHitAsync(ControllerColliderHit hit): 当该对象与控制器发生碰撞时调用。
• UniTask.OnDisableAsync(): 当对象被禁用时调用。
• UniTask.OnEnableAsync(): 当对象被启用时调用。
• UniTask.OnJointBreakAsync(float breakForce): 当该对象的关节断裂时调用。