VContainer-integrations/unitask | 集成——Unitask
UniTask 是为 Unity 优化的 async
/await
解决方案。提供与 .NET 标准的 基于任务的异步模式 相似的API,但针对 Unity 的 PlayerLoop 进行了优化。还增加了对 Unity 内置异步操作(如 UnityWebRequest
)的 async
/await
支持。
项目中安装 com.cysharp.unitask
包后,
VCONTAINER_UNITASK_INTEGRATION
编译器符号和以下功能将自动启用。
IAsyncStartable
启用 VCONTAINER_UNITASK_INTEGRATION
集成,IAsyncStartable
将使用 UniTask 作为返回值。
public class FooController : IAsyncStartable
{
public async UniTask StartAsync(CancellationToken cancellation)
{
await LoadSomethingAsync(cancellation);
await ...
...
}
}
一旦注册了实现 IAsyncStartable
的类,其 StartAsync
方法将自动执行,类似于 IStartable
。
builder.RegisterEntryPoint<FooController>();
RegisterEntryPoint
更多相关信息见 纯 C# 入口点。
StartAsync()
时机
目前,VContainer 提供的唯一 async
接口是 IAsyncStartable
。若需在不同的 PlayerLoop
阶段执行 async
代码,UniTask 本身提供了在方法内控制执行时机的方式。
若需在不同的时间调度进程,可使用 UniTask 的 PlayerLoopTiming
。
await UniTask.Yield(PlayerLoopTiming.FixedUpdate);
注意,所有 StartAsync
调用将同时安排在主线程上执行(除非在每个实现中另有指定),并且未来的 PlayerLoop
阶段不会等待它们完成。
更多信息参见 UniTask 的 PlayerLoop
文档。
异常处理
- 与
IEnumerator
支持的协程不同,async
支持完整的try
/catch
/finally
语法。 - 可通过
UniTaskScheduler.UnobservedTaskException
全局捕获异常。 - 或使用
builder.RegisterEntryPointExceptionHandler(ex => ..)
为每个 LifetimeScope 注册一个单独的错误处理程序。
更多信息参见 纯 C# 入口点 部分。
CancellationToken
StartAsync
提供了一个 CancellationToken
,会在所属的 LifetimeScope
被销毁时自动取消。
异步资源加载
UniTask 能够实现异步加载资源和场景。与 VContainer 的 LifetimeScope.Enqueue*
方法之一结合使用将更方便。
var extraAsset = await Addressables.LoadAssetAsync<ExtraAsset>(key);
using (LifetimeScope.EnqueueParent(parentScope))
using (LifetimeScope.Enqueue(builder => builder.RegisterInstance(extraAsset))
{
await SceneManager.LoadSceneAsync("AdditiveScene");
}
更多信息参见 作用域 部分。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!