Skip to main content

Plain C# Entry point

VContainer allows plain C# to be the starting point for application processing. Using it instead of MonoBehaviour, which has a lot of features, can help you build a simple control flow.

clas FooController : IStartable
void IStartable.Start()
// Do something ...

See register

VContainer does this with its own PlayerLoopSystem.

If you register a class that implements the marker interface, it will be scheduled in Unity's PlayerLoop cycle.

Since it uses PlayerLoopSystem, it works even if you register at any time (e.g: IStartable etc)

Available interfaces

VContainer entry pointTiming
IInitializable.Initialize()Immediately after building the container
IPostInitializable.PostInitialize()Late IInitializable.Initialize()
IStartable.Start()Nearly MonoBehaviour.Start()
IPostStartable.PostStart()After MonoBehaviour.Start()
IFixedTickable.FixedTick()Nearly MonoBehaviour.FixedUpdate()
IPostFixedTickable.PostFixedTick()After MonoBehaviour.FixedUpdate()
ITickable.Tick()Nearly MonoBehaviour.Update()
IPostTickable.PostTick()After MonoBehaviour.Update()
ILateTickable.LateTick()Nearly MonoBehaviour.LateUpdate()
IPostLateTickable.LateTick()After MonoBehaviour.LateUpdate()


  • IDisposable : With container disposes. (For Lifetime.Singleton / Lifetime.Scoped)

Handle of the exception that was not caught

On the application side, exceptions thrown in processes such as Start() and Tick() cannot be caught outside.

By default, VContainer logs unhandled exceptions as UnityEngine.Debug.LogException. As another option, you can register a callback for each LifetimeScope.

builder.RegisterEntryPointExceptionHandler(ex =>
// ...

Default error logging will be skipped if you are using the RegisterEntryPointExceptionHandler.


If you are using UniTask, you can use IAsyncStartable. see also UniTask Integration