스코핑 개요
커스텀을 원한다면, 집중 RND를 요구하는 구간입니다.
UNInject는 의존성을 어느 범위에서 찾고, 얼마나 오래 유지할지를 세 층으로 나눕니다.
세 층 모두 IScope 계약(Register / Resolve / Create<T> / Unregister 등)을 구현하지만,
데이터가 살아 있는 공간과 조회 순서가 다릅니다.
설계
| 층 | 담당 타입 | 수명(전형적) | 매니저 마커 |
|---|---|---|---|
| 전역 | MasterInstaller | DontDestroyOnLoad, 앱 전체 | [Referral] |
| 씬 | SceneInstaller | 현재 로드된 씬(인스턴스는 정적 싱글톤 슬롯 하나) | [SceneReferral] |
| 로컬 | ObjectInstaller | 붙은 서브트리, 필요 시 _parentScope로 상위 연결 | 로컬 Register + [Inject] |
-
전역·씬은 “매니저 레이어”를
Component레지스트리로 노출합니다. -
로컬은 같은 루트 아래
[Inject]직렬화 +[GlobalInject]/[SceneInject]런타임 주입을 함께 다룹니다.
IScope로 통일 설계된 부분
-
Named 바인딩 —
Resolve(Type, string id),ResolveAs<T>(string id),Unregister(Type, string id). -
런타임 등록 —
Register(Component),Register(Component, MonoBehaviour owner). -
Create<T>()— 순수 C#·ScriptableObject등MonoBehaviour가 아닌class만 대상.
생성자·필드 주입 후ITickable계열이면 해당 Installer의Update/FixedUpdate/LateUpdate에 붙습니다.
각 스코프가 Create<T>에서 Component 의존성을 어디서 먼저 찾는지는 서로 다릅니다(실행 순서, Resolve 체인).
주입 필드가 스코프를 고르는 법
-
[GlobalInject]— 전역 레지스트리(MasterInstaller)를 통해 해석. -
[SceneInject]— 씬 레지스트리(SceneInstaller)를 통해 해석. -
[Inject]— 에디터 Bake로 같은ObjectInstaller트리 안의 컴포넌트를 직렬화 연결.
ObjectInstaller가 TryInjectTarget을 실행할 때 씬 필드를 먼저,
그다음 전역 필드를 채웁니다. 같은 타입을 씬·전역 둘 다에서 쓰면 의도한 속성을 정확히 나누는 것이 중요합니다.
Scoping 문서 요약
- MasterInstaller — 부트스트랩,
DontDestroyOnLoad, Safety Net - SceneInstaller — 씬 한정, 인스턴스 교체 경고
- ObjectInstaller — 서브트리,
_parentScope - SceneExitPolicy — 씬 언로드 시 레지스트리
- Resolve 체인 — 로컬 → 상위 → 씬 → 전역
- 실행 순서 —
DefaultExecutionOrder와Awake