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");
}
更多信息参见 作用域 部分。

浙公网安备 33010602011771号