Skip to main content

동적 콘텐츠

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

SceneInstallerSceneExitPolicy씬 Installer가 파괴될 때 레지스트리 본체를 어떻게 할지 정합니다.

  • Clear(기본)_sceneRegistry 등을 비웁니다. 일반적인 단일 씬 전환.
info
  • Preserve_sceneRegistry는 유지합니다.
    _ownershipMap_sceneReferrals는 OnDestroy에서 정리되는 등 보존 시 설계가 분기됩니다(Additive 로딩 용도로 명시).
info

한 시점에 SceneInstaller.Instance 하나가 유효하다는 전제가 깨지지 않게 하려면,
문서화된 대로 Additive에서는 활성 SceneInstaller가 중복되지 않게 하거나,
나가는 쪽에 Preserve 를 쓰는 등 프로젝트 규칙을 맞춰야 합니다.
중복 시 경고로 인스턴스가 교체될 수 있습니다.

IScopeDestroyable정책과 무관하게 SceneInstaller 파괴 시 ClearWithDestroy 로 정리됩니다.


전역 vs 씬 스코프

  • MasterInstallerDontDestroyOnLoad, 동적 콘텐츠와 무관하게 게임 전역 매니저에 적합.

  • SceneInstaller — 현재 씬(또는 Preserve로 넘긴 맵)에 매달린 [SceneInject] 해소에 사용.

로드만 되고 아직 씬에 붙지 않은 순수 데이터는 IScope.Create<T>() 로 만들 수 있으나,
대상은 MonoBehaviour가 아닌 Pure C# 클래스 계약입니다.


ObjectInstaller 서브트리

큰 동적 프리팹을 자기 완결된 DI 서브트리로 두려면 루트에 ObjectInstaller 를 두고,
필요하면 _parentScope 로 상위를 한정합니다.
결과적으로 자식들의 [GlobalInject] / [SceneInject]그 도메인의 Resolve 체인을 타게 됩니다.


정리

info
  • UNInject 쪽에서는 SpawnInjected / InjectGameObject, Register(..., owner), SceneExitPolicy,
    ObjectInstaller 계층으로 동적 생명주기와 레지스트리를 맞춥니다.