본문으로 건너뛰기

소유권 추적 (ScopeOwnerTracker)

Register(comp, owner)에서 owner가 null이 아니면,
해당 owner가 사라질 때 등록을 되돌리기 위해 숨은 헬퍼 컴포넌트ownerGameObject에 붙습니다.


동작

  1. owner.gameObjectScopeOwnerTracker 가 없으면 추가합니다. (AddComponentMenu가 비어 있어 메뉴에는 안 나옵니다.)

  2. AddDestroyCallback(Action) 으로 콜백을 리스트에 누적합니다.
    같은 owner로 여러 번 Register하면 콜백이 여러 개 쌓일 수 있습니다.

  3. OnDestroy에서 리스트를 순회하며 각 콜백을 실행하고, 예외는 LogException 으로 흡수한 뒤 나머지를 계속 실행합니다.

  4. 콜백 본문은 스코프별로 UnregisterByOwner 를 호출해,
    owner가 등록에 기여한 컴포넌트들을 레지스트리에서 키 단위로 전부 제거합니다.


스코프별 연결

스코프콜백이 비우는 대상
MasterInstaller전역 런타임 딕셔너리 + _ownershipMap에서 해당 owner
SceneInstaller씬 런타임 딕셔너리 + 동일
ObjectInstaller로컬 딕셔너리 + 동일

SceneExitPolicy.Preserve와의 관계

씬 언로드 시 SceneInstaller가 파괴되면 _ownershipMap을 비우는 분기가 정책에 따라 달라집니다.
Preserve 에서는 레지스트리 본체는 남기려 하지만, 씬 오브젝트에 묶인 소유권 맵은 의도적으로 비웁니다.

때문에 ScopeOwnerTracker 콜백과 맞물려,
보존된 레지스트리 항목이 씬 언로드 직후에도 불필요하게 전부 지워지지 않도록 동작이 나뉩니다.


사용 시 유의

  • owner는 반드시 MonoBehaviour 여야 합니다.

  • owner를 비활성만 하고 파괴하지 않으면 콜백도 늦어집니다. 파괴 수명을 기준으로 생각하십시오.

  • 동일 GameObject에 여러 스코프에서 등록하면 콜백이 한 트래커에 모입니다
    각 콜백이 자기 스코프의 UnregisterByOwner만 호출하므로 서로 다른 레지스트리를 동시에 정리할 수 있습니다.

// 풀에서 꺼낸 매니저를 씬 오브젝트 수명에 맞춰 등록하고 싶을 때
sceneInstaller.Register(poolInstance, owner: poolRootBehaviour);