---
title: Addressables 기반 씬 전환·UI 관리 설계 제안
date: 2026-11-01T06:19:15.292Z
version: v1.0.0
status: 완료
state: complete
project: sampleprojectforunity
type: 검토
report_kind: result
category: 검토
summary: Bootstrap 유지, 씬 전환 직렬화, UI 레이어와 수명 구분을 제안합니다. 구현·실행 검증은 수행하지 않았습니다.
format: tracefolio-v2
priority: normal
severity: normal
reporter: 미기록
assignee: 미지정
payload: ../assets/submissions/2026-11-01-result-20261101061915292-v1.0.0.json
---

## 작업 결과

설계 검토를 완료했습니다. Unity 6000.0.83f1, Addressables 2.9.1을 현재 설정에서 확인했습니다. 게임 코드는 수정하지 않았습니다.

권장 구성은 Bootstrap 씬 아래 SceneTransitionManager와 UIManager를 두는 방식입니다. 기존 HUDManager는 캐릭터 추적 HUD와 풀링을 계속 담당하도록 제안합니다.

## 변경 내용

### 적용 내용

설계 제안이며 구현 완료를 의미하지 않습니다.

| 구성 | 책임 |
|---|---|
| Bootstrap | 관리자, UIRoot, 단일 EventSystem 유지 |
| SceneTransitionManager | 중복 요청 제어, 로딩 화면, 씬 핸들 소유, 전환 성공·실패 처리 |
| UIManager | UI 프리팹 비동기 생성, 화면·팝업·오버레이 레이어, 중복 열기 제어, 닫기·해제 |
| SceneDefinition | 씬 ID, AssetReference, 기본 화면 UI ID |
| UIDefinition | UI ID, AssetReferenceGameObject, 레이어, Global/Scene 수명, 닫기 정책 |

전환 흐름: 전환 잠금 → 입력 차단·로딩 표시 → 다음 씬 Additive 로드(activateOnLoad:true) → SceneManager.SetActiveScene → 다음 씬 초기화 준비 확인 → 이전 Scene 수명 UI 닫기 및 이전 씬 언로드 → 새 화면 표시 → 로딩 숨김·입력 복원. 이전 씬을 유지한 준비 단계에서는 양쪽 게임플레이를 명시적으로 정지합니다. Awake/OnEnable의 부작용도 준비 계약으로 통제합니다. 다음 씬 초기화 전 실패는 새 씬을 정리하고 기존 씬으로 복귀하며, 이전 씬 언로드가 시작된 이후 실패는 단계별 복구 상태로 처리합니다. 두 씬 동시 유지의 메모리 비용은 실제 콘텐츠로 측정해야 합니다.

UI는 Screen/Popup/Overlay 레이어와 별도로 Global/Scene 수명을 둡니다. 로딩·오류 오버레이는 Global, HUD·인벤토리는 기본 Scene 수명입니다. 모달은 UIManager가 게임 입력 차단 소유권을 관리하며 마지막 모달이 닫힌 후 복원합니다. 닫기(숨김·캐시)와 파괴(해제)를 구분하고 첫 구현은 닫을 때 해제로 단순화합니다. 자주 쓰는 UI 캐시는 측정 후 추가합니다.

Addressables.InstantiateAsync로 생성한 UI는 ReleaseInstance로 해제합니다. LoadAssetAsync 후 일반 Instantiate 방식을 택하면 인스턴스를 모두 파괴한 뒤 원본 핸들을 Release해야 하므로 첫 구현에서는 두 방식을 섞지 않습니다. 씬 핸들은 SceneTransitionManager, UI 인스턴스 핸들은 UIManager가 소유합니다. 씬 로드 핸들은 UnloadSceneAsync 수명 규칙을 따르며 이중 해제하지 않습니다. 비동기 요청자가 사라져도 로드가 자동 취소되었다고 가정하지 않고, 완료 후 결과를 폐기·해제하는 경로를 둡니다.

Addressables 그룹은 Scenes, UI-Global, UI-Gameplay 등 수명·배포 기준으로 나눕니다. 번들 분리는 그룹 이름만으로 보장되지 않으므로 packing 설정·공유 의존성을 Build Layout에서 확인합니다. Bootstrap에서는 Addressable 프리팹을 직접 참조하여 중복 포함시키지 않고 AssetReference로 보관합니다. 진행률은 다운로드 바이트와 씬 준비 단계를 구분합니다.

첫 구현 범위: Bootstrap, 테스트 씬 2개, 로딩 UI, 화면 1개, 팝업 1개. A→B→A 반복, 연속 전환 요청, 중복 UI 열기, 없는 주소, 씬 초기화 실패, 이벤트 구독 해제와 Addressables 참조 수명을 플레이어 빌드에서 검증합니다.

## 검증

현재 Packages/manifest.json, ProjectSettings/ProjectVersion.txt, Assets/Scripts/UI/HUD/HUDManager.cs, Assets/Scripts/Utils/SingletonScriptableObject.cs를 읽었습니다. HUDManager의 추적 HUD 풀링 책임과 SingletonScriptableObject의 WaitForCompletion 사용을 확인했습니다. 신규 전환·UI 경로는 비동기로 설계하도록 제안합니다.

설치된 Addressables 2.9.1 Documentation~/LoadingScenes.md에서 activateOnLoad:false가 다른 Addressable 로드 큐를 막는다고 확인했습니다. 따라서 로딩 UI를 먼저 준비하고 초기 버전에서는 activateOnLoad:true를 사용하도록 제안합니다.

공식 근거: [메모리 관리](https://docs.unity3d.com/Packages/com.unity.addressables@2.9/manual/MemoryManagement.html), [씬 언로드 API](https://docs.unity.cn/Packages/com.unity.addressables@2.9/api/UnityEngine.AddressableAssets.Addressables.UnloadSceneAsync.html). 웹의 LoadingScenes 페이지는 조회 시간 초과가 발생하여 설치 패키지 원문으로 확인했습니다.

실제 게임 실행·화면 검증은 수행하지 않았습니다. 설계 검토이며 실행 결과물이 없어 캡처 이미지를 만들지 않았습니다.

## 남은 사항

구현과 플레이어 빌드 검증은 별도 작업입니다. 실제 메모리 사용량·기존 씬의 초기화 부작용·UI 입력 연동은 미확인입니다. 공식 프로젝트 로고는 확인하지 못해 logo:null로 등록했습니다.

교훈 검토: 변경 없음 — 핸들 소유권과 큐 제약은 이 프로젝트·패키지 설계 근거로 기록했으며 새로운 전역 규칙은 추가하지 않았습니다.

## 작업 시간

- 제안 시간: 2~4분
- 실제로 완료된 시간: 2026-11-01 15:17:26 KST 시작. 설계 근거 검토 완료 시각 2026-11-01 15:19:15 KST. 공개 배포 검증 시간은 최종 채팅에 별도 기록합니다.
- XERJ: 미사용 — XERJ MCP·프로젝트 검색 스크립트가 확인되지 않아 rg로 소스 검색.
