为什么使用?
Unity的Coroutine写法难以维护、缺少返回值;
若尝试使用async/await 会C#的Task增多,频繁触发GC,有可能会导致性能问题;
UniTask的优点:
可以支持async/await,且几乎不产生GC;
兼容Unity的生命周期和主线程;
在WebGL和微信小程序等IL2CPP下稳定运行;
UniTask&Coroutine&Task三者:
UniTask:
支持返回值,几乎不产生GC(因为是Struct,属于值类型),支持异常捕获,支持取消(通过CancellationToken),在IL2CPP下稳定运行(WebGL、移动设备的高兼容),支持链式调用,提供PlayerLoop集成Unity生命周期。
Coroutine:
进行异步操作时需要进行手动封装,不支持返回值(需要用到在外部自定义变量接收值(但是会引发竞态问题,不推荐)或使用回调函数),trycatch不好用、链式调用很麻烦、与Unity生命周期深度集成,稳定运行于WebGL和移动设备中。
Task:
支持异步操作、支持返回值、支持异常捕获、支持取消操作(通过CancellationToken),但是会产生大量GC,支持链式调用,与Unity生命周期的兼容性较差(unity程序停止,Task有可能还在运行,它不受Unity生命周期自动管理),无法在WebGL和移动设备中高兼容地稳定运行。