동적 콘텐츠
Addressables·Resources·에셋 번들 등 로딩 파이프라인은 UNInject에 포함되어 있지 않습니다.
SDK가 제공하는 것은 인스턴스가 생긴 뒤 레지스트리에 올리고, 그 계층에 주입을 맞추는 스코프·API입니다.
동적 콘텐츠는 “로드 → (필요 시) 등록 → 스폰·주입” 순으로 붙이면 됩니다.
런타임 생성 후 주입
| API | 용도 |
|---|---|
IScope.SpawnInjected(prefab) | Instantiate 후 루트 또는 단일 MonoBehaviour에 맞춰 주입 |
ObjectInstaller.InjectGameObject(go) | 이미 존재하는 계층에 자식 전체 주입 |
ObjectInstaller.InjectTarget(mb) | 단일 컴포넌트만 주입 |
프리팹이 ObjectInstaller가 있는 서브트리라면, 스폰 직후 Awake에서 InjectGlobalDependencies 가 돌아가며 자동으로
[GlobalInject] / [SceneInject] 필드를 채우는 경우가 존재합니다.
그래도 씬 매니저를 나중에 등록했다면, 등록 후 InjectTarget / InjectGameObject를 한 번 더 호출해야 할 수 있습니다.
런타임 등록: Register와 소유자
동적으로 생성한 매니저성 컴포넌트를 씬(또는 전역) 레지스트리에 올리려면
Register(Component) 또는 Register(Component, owner) 를 씁니다.
-
Register(comp, owner)—owner가 파괴될 때ScopeOwnerTracker가 스코프에서 해당 등록을 자동으로 제거합니다.
동적 월드 조각의 “대표”MonoBehaviour를 오너로 두는 패턴에 맞습니다. -
Register(comp)— 소유권 없음; 직접Unregister하거나 오브젝트 파괴 전략을 따로 잡아야 합니다.
등록 시 ReferralAttribute / SceneReferralAttribute 와 함께 쓰이면,
에디터에서 쓰던 것과 같은 키(타입·Id) 규칙으로 런타임 맵에 올라갑니다.
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private SceneInstaller _scene;
private void OnChunkLoaded(ChunkController chunk)
{
var svc = chunk.GetComponentInChildren<DynamicWaveService>();
if (svc != null)
_scene.Register(svc, owner: chunk);
}
}
Additive 씬과 SceneExitPolicy
SceneInstaller는 SceneExitPolicy 로 씬 Installer가 파괴될 때 레지스트리 본체를 어떻게 할지 정합니다.
Clear(기본) —_sceneRegistry등을 비웁니다. 일반적인 단일 씬 전환.
Preserve—_sceneRegistry는 유지합니다.
_ownershipMap과_sceneReferrals는 OnDestroy에서 정리되는 등 보존 시 설계가 분기됩니다(Additive 로딩 용도로 명시).
한 시점에 SceneInstaller.Instance 하나가 유효하다는 전제가 깨지지 않게 하려면,
문서화된 대로 Additive에서는 활성 SceneInstaller가 중복되지 않게 하거나,
나가는 쪽에 Preserve 를 쓰는 등 프로젝트 규칙을 맞춰야 합니다.
중복 시 경고로 인스턴스가 교체될 수 있습니다.
IScopeDestroyable은 정책과 무관하게 SceneInstaller 파괴 시 ClearWithDestroy 로 정리됩니다.
전역 vs 씬 스코프
-
MasterInstaller—DontDestroyOnLoad, 동적 콘텐츠와 무관하게 게임 전역 매니저에 적합. -
SceneInstaller— 현재 씬(또는 Preserve로 넘긴 맵)에 매달린[SceneInject]해소에 사용.
로드만 되고 아직 씬에 붙지 않은 순수 데이터는 IScope.Create<T>() 로 만들 수 있으나,
대상은 MonoBehaviour가 아닌 Pure C# 클래스 계약입니다.
ObjectInstaller 서브트리
큰 동적 프리팹을 자기 완결된 DI 서브트리로 두려면 루트에 ObjectInstaller 를 두고,
필요하면 _parentScope 로 상위를 한정합니다.
결과적으로 자식들의 [GlobalInject] / [SceneInject] 가 그 도메인의 Resolve 체인을 타게 됩니다.
정리
- UNInject 쪽에서는
SpawnInjected/InjectGameObject,Register(..., owner),SceneExitPolicy,
ObjectInstaller계층으로 동적 생명주기와 레지스트리를 맞춥니다.