VContainer-integrations/entrypoint | 集成——纯 C# 入口点

VContainer 允许使用纯 C# 类作为应用入口点。
相比功能复杂的 MonoBehaviour,这种方式能简化控制流。

class FooController : IStartable
{
    void IStartable.Start()
    {
        // 初始化逻辑...
    }
}
builder.RegisterEntryPoint<FooController>();

参见 注册纯 C# 类型

VContainer 通过自定义 PlayerLoopSystem 实现生命周期管理。

注册实现了标记接口的类后,它们会被调度到 Unity 的主循环中执行。

由于它使用了 PlayerLoopSystem,在任何时候注册(例如:IStartable 等)类,它都能正常工作。

可用的接口

VContainer 入口点 时机
IInitializable.Initialize() 容器构建后立即执行
IPostInitializable.PostInitialize() 晚于 IInitializable.Initialize()
IStartable.Start() 近似 MonoBehaviour.Start()
IAsyncStartable.StartAsync() 近似 MonoBehaviour.Start()
IPostStartable.PostStart() 晚于 MonoBehaviour.Start()
IFixedTickable.FixedTick() 近似 MonoBehaviour.FixedUpdate()
IPostFixedTickable.PostFixedTick() 晚于 MonoBehaviour.FixedUpdate()
ITickable.Tick() 近似 MonoBehaviour.Update()
IPostTickable.PostTick() 晚于 MonoBehaviour.Update()
ILateTickable.LateTick() 近似 MonoBehaviour.LateUpdate()
IPostLateTickable.PostLateTick() 晚于 MonoBehaviour.LateUpdate()

以及

  • IDisposable : 随容器销毁时调用。(适用于 Lifetime.Singleton / Lifetime.Scoped

:::note
Unity - Manual: Order of Execution for Event Functions
:::

async 异步支持

IAsyncStartableIStartable 的一个变体。
其执行时机与 IStartable 相同,但可使用 async Awaitable StartAsync() 语法。

UniTask 用户可以选择 UniTask 版本的 StartAsync
UniTask 集成

处理未捕获的异常

在应用程序端,无法捕获在 Start() 和 Tick() 等过程中抛出的异常。

默认情况下,VContainer 会将未处理的异常记录为 UnityEngine.Debug.LogException
也可以为每个 LifetimeScope 注册一个回调用来自定义异常处理:

builder.RegisterEntryPointExceptionHandler(ex =>
{
    // ...
});

:::caution
注册自定义处理器 RegisterEntryPointExceptionHandler 后,默认的错误日志记录将失效。
:::

posted @ 2025-02-17 23:37  凌雪寒  阅读(167)  评论(0)    收藏  举报