Quick Flow
manager가 오래 살아야 하는 이유는 이름이 아니라 scope입니다. scope owner가 만들고, ready를 기다리고, 사용을 허용하고, scene/mode 종료에서 child resource를 정리합니다.
App scope: settings, account session
-> creates Mode scope: battle flow, match services
-> creates Scene/View scope: HUD, local input, effects
-> shutdown: unsubscribe -> cancel -> release -> destroy| 대상 | 자연스러운 scope | 종료 때 확인할 것 |
|---|---|---|
| account·app settings | app | static reset·application exit |
| match/battle flow | mode | rematch·leave·failure retry |
| scene gameplay system | scene | sceneUnloaded·destroyed reference |
| popup/presenter | view | disable·close·pooled reuse |
| loaded asset/instance | resource owner | handle release·instance release |
생성부터 ready까지
manager는 constructor/Awake가 끝났다고 ready가 아닐 수 있습니다. save load, remote config, Addressables, scene injection이 있다면 readiness를 state로 모델링하고, consumer가 ready 이전 API를 호출했을 때 fail, queue, await 중 무엇을 할지 정합니다. app scope가 scene scope manager를 직접 생성해 영구 reference로 들고 있으면 scene 전환 뒤 stale object가 남습니다.
scope owner는 duplicate creation policy도 정합니다. battle을 다시 시작할 때 기존 manager를 dispose하고 새 scope를 만들지, state를 reset해 재사용할지, running async operation을 cancel할지 명시합니다. singleton 또는 static registry는 이 owner를 대체하지 않습니다.
shutdown 순서
종료는 Destroy에 맡겨지는 side effect가 아니라 계약입니다. 먼저 신규 input/event subscription을 막고, 진행 중 coroutine·task·network request를 cancel하고, Addressables handle과 pooled object를 release한 뒤 object reference를 해제합니다. SceneManager.UnloadSceneAsync는 scene GameObject를 파괴하므로 scene-local resource cleanup과 persistent service reference 무효화 순서를 test합니다.
Addressables operation handle은 사용 기간 동안 보관하고 owner가 Addressables.Release합니다. load가 실패해도 handle을 release해야 할 수 있고, view가 닫힌 뒤 완료된 callback이 UI를 갱신하지 않도록 scope token/version을 둡니다. pool도 Release가 정확히 한 번 일어나게 합니다.
lifecycle test
scene unload 중 asset load 완료, rapid open/close, mode 재진입, boot 실패 뒤 retry, Editor Play Mode 반복을 test합니다. 각 resource가 누가 만들고 누가 정리하는지 로그·counter로 확인하며, OnDisable이 여러 번 호출돼도 shutdown이 idempotent한지 봅니다.
DontDestroyOnLoad는 lifecycle 설계가 아닙니다. object를 살려 둘 수는 있지만 구독, async callback, handle, scene reference를 언제 정리할지는 별도로 정해야 합니다.
참고 링크
2 sources