### **순수 C# 진입점 (Plain C# Entry point)** - **목표:** `MonoBehaviour`가 아닌 일반 C# 클래스를 애플리케이션 로직의 진입점으로 사용하여, `MonoBehaviour`가 가진 많은 기능(이벤트 처리, 제어 흐름, 도메인 로직 호출 등)으로부터 핵심 로직을 분리하고 단순한 제어 흐름을 구축하도록 돕습니다. - **구현 방법:** 특정 "마커 인터페이스(marker interface)"를 구현하는 클래스를 VContainer에 등록하면, 해당 클래스의 메서드가 Unity의 `PlayerLoop` 시스템에 스케줄링되어 특정 시점에 자동으로 실행됩니다. **기본 예시:** C# ``` class FooController : IStartable // IStartable 인터페이스 구현 { void IStartable.Start() { // Do something... } } // LifetimeScope의 Configure 메서드에서 등록 builder.RegisterEntryPoint<FooController>(); ``` - **설명:** `FooController` 클래스는 `IStartable` 인터페이스를 구현합니다. `builder.RegisterEntryPoint<FooController>()`를 통해 이 클래스를 등록하면, `IStartable.Start()` 메서드가 Unity의 `MonoBehaviour.Start()`와 유사한 시점에 자동으로 호출됩니다. **VContainer 진입점 및 타이밍:** VContainer는 여러 가지 마커 인터페이스를 제공하며, 각 인터페이스는 Unity의 `PlayerLoop` 주기 내에서 특정 실행 타이밍을 가집니다. 이는 `MonoBehaviour`의 `Awake`, `Start`, `Update`, `FixedUpdate`, `LateUpdate`와 유사한 생명주기 이벤트를 순수 C# 클래스에서 처리할 수 있게 합니다. |VContainer Entry Point|Timing| |:--|:--| |`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.Dispose()`|컨테이너 폐기 시 (Singleton / Scoped 라이프타임용)| Sheets로 내보내기 - **`IAsyncStartable`:** `IStartable`의 비동기 버전으로, `async UniTask StartAsync()`와 같이 비동기 작업을 시작할 수 있습니다. `UniTask`를 사용하는 경우 `VCONTAINER_UNITASK_INTEGRATION` 컴파일러 심볼이 활성화되어야 합니다. - **예외 처리 (Unhandled Exceptions):** - 기본적으로 VContainer는 `Start()`, `Tick()` 등에서 발생한 처리되지 않은 예외를 `UnityEngine.Debug.LogException`으로 기록합니다. - 사용자 정의 예외 처리를 위해 `builder.RegisterEntryPointExceptionHandler(ex => { /* Custom handling */ });`를 등록할 수 있습니다. - **주의:** `RegisterEntryPointExceptionHandler`를 사용하면 기본 예외 로깅은 건너뛰게 됩니다. **PlayerLoopSystem 사용의 이점:** - `PlayerLoopSystem`을 사용하기 때문에, 언제든지 (예: 게임 중간에) 새로운 진입점을 등록해도 Unity의 게임 루프에 정확하게 스케줄링되어 작동합니다. - 이는 `MonoBehaviour`에 의존하지 않고도 게임의 핵심 로직을 유연하게 제어하고, 도메인 로직과 뷰를 명확하게 분리하는 데 큰 장점을 제공합니다. ### 요약 VContainer의 핵심적인 "순수 C# 진입점" 기능을 소개합니다. 이 기능을 통해 개발자는 `MonoBehaviour`에 묶이지 않고도 Unity의 `PlayerLoop`에 통합되는 생명주기 이벤트를 가진 일반 C# 클래스를 정의하고 등록할 수 있습니다. 이는 코드의 분리, 테스트 용이성, 그리고 아키텍처의 유연성을 크게 향상시키는 데 기여합니다. --- 이전 : [[4.7 Register Callbacks]] | 다음 : [[5.2 UniTask]]