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");
}

更多信息参见 作用域 部分。

posted @   凌雪寒  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示