소유권 추적 (ScopeOwnerTracker)
Register(comp, owner)에서 owner가 null이 아니면,
해당 owner가 사라질 때 등록을 되돌리기 위해 숨은 헬퍼 컴포넌트가 owner의 GameObject에 붙습니다.
동작
-
owner.gameObject에ScopeOwnerTracker가 없으면 추가합니다. (AddComponentMenu가 비어 있어 메뉴에는 안 나옵니다.) -
AddDestroyCallback(Action)으로 콜백을 리스트에 누적합니다.
같은owner로 여러 번Register하면 콜백이 여러 개 쌓일 수 있습니다. -
OnDestroy에서 리스트를 순회하며 각 콜백을 실행하고, 예외는LogException으로 흡수한 뒤 나머지를 계속 실행합니다. -
콜백 본문은 스코프별로
UnregisterByOwner를 호출해,
그owner가 등록에 기여한 컴포넌트들을 레지스트리에서 키 단위로 전부 제거합니다.
스코프별 연결
| 스코프 | 콜백이 비우는 대상 |
|---|---|
MasterInstaller | 전역 런타임 딕셔너리 + _ownershipMap에서 해당 owner |
SceneInstaller | 씬 런타임 딕셔너리 + 동일 |
ObjectInstaller | 로컬 딕셔너리 + 동일 |
SceneExitPolicy.Preserve와의 관계
씬 언로드 시 SceneInstaller가 파괴되면 _ownershipMap을 비우는 분기가 정책에 따라 달라집니다.
Preserve 에서는 레지스트리 본체는 남기려 하지만, 씬 오브젝트에 묶인 소유권 맵은 의도적으로 비웁니다.
때문에 ScopeOwnerTracker 콜백과 맞물려,
보존된 레지스트리 항목이 씬 언로드 직후에도 불필요하게 전부 지워지지 않도록 동작이 나뉩니다.
사용 시 유의
-
owner는 반드시MonoBehaviour여야 합니다. -
owner를 비활성만 하고 파괴하지 않으면 콜백도 늦어집니다. 파괴 수명을 기준으로 생각하십시오.
-
동일 GameObject에 여러 스코프에서 등록하면 콜백이 한 트래커에 모입니다
각 콜백이 자기 스코프의UnregisterByOwner만 호출하므로 서로 다른 레지스트리를 동시에 정리할 수 있습니다.
// 풀에서 꺼낸 매니저를 씬 오브젝트 수명에 맞춰 등록하고 싶을 때
sceneInstaller.Register(poolInstance, owner: poolRootBehaviour);