# GodDem 대화로그 — 2026-08-25 > §번호는 프로젝트 누적 연속 (2026-08-24.md §109에서 이어짐) > > **파일 분기 주의**: §108·§109 는 집행일이 2026-08-25 이지만 세션 연속성 때문에 `2026-08-24.md` 에 있다(PM 판정 = 08-24 §109). 같은 날짜 엔트리가 두 파일로 갈리므로 08-25 작업 이력을 추적할 때는 두 파일을 함께 볼 것. ## 110. 구 UGUI 아웃게임(카드·카드뽑기·영웅) 접근 경로 복구 (개발팀장, GodDem 로컬 커밋 `af78882`) ### PD 원문 (2026-08-25) > "본 프로젝트 초기에 UI 툴킷에서 UGUI로 바꾼 버전의 기능들 (카드 및 카드 뽑기 기능, 영웅 기능 등등)을 되살리라는 얘기야. 아웃게임 컨텐츠는 재활용하려고 했는데 UI를 바꾸면서 기능조차 다 바뀐거 같아" ### PM 하달 범위 **"접근 경로 복구 + 동작 실태 보고"까지.** 구 UGUI 화면의 기능 수정·리팩터·Layer Lab UI 재이식은 범위 밖(금지). 씬(.unity)·프리팹 편집 절대 금지(PD 에디터 테스트 중) — 코드 전용. Unity MCP 읽기 전용. GodDem 로컬 커밋까지(push 금지 = PM 영역), BT 커밋 금지. ### 실측 (개발팀장 독립 검증 — PM 실측 전건 재확인 + 신규 4건) PM 제공 실측 5항목은 전부 재확인됐다. 그 위에 **설계를 바꾼 신규 실측 4건**이 나왔다. | # | 실측 | 근거 | 설계 영향 | |---|------|------|----------| | 1 | 구 UGUI 코드 **46파일 전량 잔존**(삭제 0건) | `ls Assets/Script/UGUI/*.cs \| wc -l` = 46 | 복구 = 재작성 아님 | | 2 | `Lobby.unity` L747 `UGUIUIControllers` **m_IsActive 0** | 씬 YAML 직접 파싱 | 런타임 SetActive 로 충분 | | 3 | **★신규** 씬 직렬화 L765-766 `_canvas: {fileID: 0}` · `_uiRoot: {fileID: 0}` = **둘 다 null** | 씬 YAML | `EnsureCanvas()`가 새 캔버스를 **sortingOrder 0**(기본값)으로 생성 → GodDem 캔버스(100, `SurvivalLobbyController.cs:84`)에 가려짐. **SetActive(true) 만으로는 화면에 안 뜬다** | | 4 | **★신규** `UGUILobbySceneUIController`는 `Awake`/`Start` 아닌 **`OnEnable`에서 `SetupViews()`**, `OnDisable` 미구현 | `UGUILobbySceneUIController.cs:47` | SetActive(false)→(true) 반복 시 **MainDocument 중복 Instantiate + `MainMenuUIEvents` 중복 구독 + `_allViews` 누적**(readonly List·Clear 없음) | | 5 | **★신규** `MainDocument.prefab`(4.2MB) 내 `safe-area`·`LobbyScreen`·`UpgradeScreen`·`ContentsScreen`·`CardScreen`·`ShopScreen`·`MainMenu`·`Header` **각 1건 실존**, `UGUIStyleTheme.asset` 실존 | 프리팹 YAML `m_Name` 카운트 | 직렬화 참조 유효 = 초기화 성공 가능성 높음 | | 6 | **★신규** `UGUIView` 생성자는 root null 시 `ArgumentNullException` **throw** | `UGUIView.cs:56` | 노드 1개만 누락돼도 OnEnable 전체 중단 → 예외 포착 장치 필요 | | 7 | `UGUIModalControllers` **활성**(m_IsActive 1)·`_sortingOrder: 10`·모달 **15종 전부 결선** | 씬 YAML `_modalPrefabs` 전수 | 가챠 결과/확률·영웅 상세/선택/프로필·장비상세·공격상세 모두 프리팹 연결 살아 있음 | | 8 | 세이브 **완전 분리** — 원작 `save.txt`(`Toolkit.UserData.cs:14`), Survival `survival_meta.json`(`SurvivalMeta.cs:111`) | 소스 | 진행도 상호 오염 없음 | | 9 | **재화는 공유** — `PlayerManager.GetUserData()`가 `CurrencyManager.Instance.GetSavedData()` 포함, Survival 로비도 동일 `CurrencyManager.Add/Sub` 사용 | `PlayerManager.cs:60`·`SurvivalLobbyController.Gacha.cs:445` 외 | **골드·젬은 양쪽이 같은 지갑** = 유일한 실질 충돌축 | | 10 | `MainMenuUIEvents`는 UGUI·UITK 스택 전용, `SurvivalLobbyController` **미사용** | grep 전수 | 이벤트 충돌 없음 | ### 설계 결정과 기각안 (C32) **결정 1 — 전환 방식: 최초 1회 `SetActive(true)` + 이후 왕복은 캔버스 `enabled` 토글** - 근거: 실측 4. `OnDisable`이 없어 SetActive 왕복은 문서 중복 생성·이벤트 중복 구독을 누적시킨다. 최초 활성만 SetActive 로 하고 그 뒤로는 컨트롤러를 계속 켜 둔 채 캔버스만 껐다 켠다. - **기각안**: 복귀 시 `UGUIUIControllers.SetActive(false)` → 재진입 시 다시 `true`. **기각 사유** = 재진입마다 MainDocument 4.2MB 프리팹이 한 겹씩 더 쌓이고 메뉴 하이라이트 이벤트가 2중·3중 발화한다(구조적 누수). **결정 2 — 숨김은 `canvas.enabled = false` + `GraphicRaycaster.enabled = false` (GameObject `SetActive(false)` 기각)** - 근거: `SurvivalLobbyController`는 `_toastRoutine` 코루틴을 돌리고 `_lobby`/`_shop`/`_hero`와 성장·강화·마스터리 패널의 `activeSelf`로 화면 상태를 보유한다. `SetActive(false)`는 하위 전체 `OnDisable` 연쇄 + `Selectable` 상태 리셋 + TMP 재레이아웃을 유발한다. **단순 "안 보이게 하기"의 대가로 과하다.** `canvas.enabled=false`는 렌더만 멈추고 계층 상태를 건드리지 않아 **복귀 시 직전 화면이 그대로 살아 있다**(PM 지시 "복귀 시 상태 보존에 안전한 쪽 판단·근거 기재" 이행). - 캔버스만 끄면 `GraphicRaycaster`가 남아 **보이지 않는 클릭**을 먹으므로 양쪽 대칭으로 함께 끈다. - **기각안**: GodDem 캔버스 GameObject SetActive(false). **기각 사유** = 위 상태 파괴. 부수적으로 `Toast`가 GodDem 캔버스 자식이라 어느 방식이든 구 UI 표시 중에는 가려진다 → 복귀 오버레이에 별도 상태 텍스트를 둬 해소. **결정 3 — 복귀 버튼은 별도 캔버스(`TempNavLegacyOverlay`, sortingOrder 500), 컨트롤러 자식(GodDem 캔버스 **밖**)** - 근거: 복귀 버튼을 GodDem 캔버스 안에 두면 그 캔버스를 끄는 순간 같이 사라져 **돌아올 방법이 없어진다**. sortingOrder 500 은 구 메인(0)·구 모달(10)·GodDem(100) 전부보다 위. **결정 4 — 캔버스 포착 실패 시 전환 자체를 취소** - 근거: 구 캔버스를 못 잡은 채 GodDem 로비만 끄면 **아무것도 없는 화면에 갇힌다**. `_tnLegacyCanvases.Count == 0`이면 GodDem 로비를 유지하고 Console + Toast 로 사유를 남긴다. **결정 5 — 초기화 예외는 `Application.logMessageReceived` 훅으로 원문 회수** - 근거: Unity 는 `OnEnable` 내부 예외를 콘솔에만 남기고 `SetActive` 호출부로 전파하지 않는다. `try/catch` 만으로는 실측 6의 `ArgumentNullException`을 놓친다. 활성화 순간에만 훅을 걸어 Error/Exception/Assert 를 **가공 없이 그대로** Console + 오버레이 상태 텍스트에 노출한다. **임의 수정 금지**(복구 범위 판단은 PM·PD 영역) 준수. ### 산출물 - **GodDem 로컬 커밋 `af78882`** (1 파일 · 336 insertions · 7 deletions). **push 미실시 = PM 영역.** BT 레포 커밋 없음 - 수정 **1파일**: `E:\NerdNavis\GodDem\Assets\Script\Survival\SurvivalLobbyController.TempNav.cs` (**+336 / -7**) - 진입 버튼 "구 아웃게임"(8번째·전용 색) → `TnEnterLegacyOutgame()` - 복귀 오버레이 "GodDem 로비로"(우상단 고정) → `TnExitLegacyOutgame()` - 탐색 `TnResolveLegacyRoot()` — 씬 루트 순회(비활성 포함). `GameObject.Find` 미사용(PM 지시 준수). 폴백 = `Resources.FindObjectsOfTypeAll()` + 씬 소속 필터 - 캔버스 포착 `TnCollectLegacyCanvases()` — 활성화 전후 씬 루트 **차집합**. 폴백 = `LobbyScreen` 노드 보유 캔버스 역추적(씬에서 `_uiRoot`가 나중에 결선되는 경우 대비). 스냅샷을 `_tnRootsBeforeLegacy` 필드로 보존해 **포착 실패 시 재클릭마다 재시도**(감사 I2) - C2 헤더 주석 2축 개정(감사 I3) — 축2 = 구 UGUI 기능의 GodDem 신 UI 재이식, 본 버튼은 그 축의 진단용 proxy - 패널 레이아웃: 버튼 7→8개로 **800→896** 확대. 아래변 720 고정·위로만 96 확장(중심 오프셋 160→208) — 아래로 키우면 `Shadow` 상단 713 침범. 상단 1616 < `BannerFrame03` 하단 1629 → 무충돌 유지 - 백업 `공유/개발팀_백업/GodDem/SurvivalLobbyController.TempNav.cs.bak_20260825_0200.cs` (C6·감사 M1 정정 후 파일명) - 컴파일 산출물 `공유/개발팀_백업/GodDem/compile_legacy_outgame_switch.bak_20260825_0200.log` (§93 ⑤ 표준) - PD 지시 로그 백업 `공유/개발팀_백업/GodDem/개발팀_PD_지시_로그.md.bak_20260825_0200.md` (M2 등재 선행 백업) - 세 백업 모두 BT `.gitignore` 매칭 확증 — `git check-ignore -v`: `.gitignore:66 *.bak_*` / `.gitignore:78 *.log` (BT 미추적) - **씬·프리팹 무접촉** — `git status`에 `.unity`·`.prefab` 변경 0건 ### 구 UGUI 아웃게임 화면별 동작 실태표 (PD 의사결정 근거) ③ 열림 여부는 **런타임 Play 검증 불가**(PD 에디터 테스트 중·Play 제어 금지)이므로 **전부 소스 근거 기반 판정**이며 실행 확인은 **미검증**이다. | 화면 | ① 코드 잔존 | ② 씬/프리팹 참조 | ③ SetActive 후 열림 (미검증·소스 근거) | ④ Survival 메타 충돌 | |------|-----------|----------------|----------------------------------|-------------------| | **LobbyScreen** | `UGUILobbyView.cs` 잔존 | 프리팹 노드 1건 | **열릴 전망** — 첫 화면으로 `OpenScreen(_lobbyView)` 고정. `PlayerManager`(스테이지 이동·미션) 의존 | ⚠ **시작 버튼이 `SceneManager.LoadScene("Battle")`**(`UGUILobbyView.cs:83`) — GodDem 전투는 `SurvivalBattle`. 누르면 **구 전투 씬으로 이탈**(Battle.unity 실존·빌드세팅 enabled). 복귀는 구 설정모달 LoadScene("Lobby")로 가능하나 그때 임시 메뉴부터 다시 눌러야 함 | | **UpgradeScreen** | `UGUIUpgradeView` + `UGUIEnhanceContentView`·`UGUIEvolutionContentView` 잔존 | `content--enhance`·`content--evolution` 노드 | **열릴 전망** — `PlayerManager`·`TableManager` 의존 | 재화 공유(아래 공통). Survival 장비강화(B2)와 **별개 시스템**(세이브 분리) | | **ContentsScreen** | `UGUIContentsView` 잔존 | `defence_dungeon_card`·`invasion_dungeon_card` 노드 | ⚠ **위험 지점** — `SetVisualElements()`가 `TableManager.Instance.ExtraContents[BattleType.Defense]`를 **널가드 없이 인덱싱**. 테이블 미로드·키 부재 시 **생성자에서 예외 → OnEnable 전체 중단**(다른 화면까지 미생성) | 던전 입장권(`EnterTicketID`) = `CurrencyManager` 재화 | | **CardScreen** | `UGUICardView` + 탭 4종 | `content--item`·`--skill`·`--rune`·`--hero` 노드 | **열릴 전망** — Item 탭 기본 활성 | **PD 지목 본체.** 아래 탭별 세부 참조 | | ┗ Item 탭 (**카드뽑기**) | `UGUIItemContentView`·`UGUIItemCard`·`UGUIItemDetailModal` | `gacha_button--1time`·`--10times` 노드 | **열릴 전망** — 뽑기 실행 = `PlayerManager.GachaController.GachaTrackers[Constant.CARD_GACHA_ID]` | 구 가챠(`save.txt`) ↔ Survival 가챠(`survival_meta.json`) **완전 분리**. 단 소모 재화는 공유 지갑 | | ┗ Skill 탭 | `UGUISkillContentView` = **빈 플레이스홀더** | 노드만 존재 | 열리지만 **원작에서도 비어 있음**(코드 주석 명시) | 없음 | | ┗ Rune 탭 | `UGUIRuneContentView`·`UGUIRuneCard`·`UGUIRuneDetailModal`·`UGUIRuneResetModal` | 모달 2종 결선 | **열릴 전망** — `TableManager`·`PlayerManager` 의존 | Survival 에 대응 시스템 없음 | | ┗ **Hero 탭 (영웅)** | `UGUIHeroContentView`·`UGUIEquipButton` | 모달 3종(Detail·Select·Profile) + `EquipmentDetailModal` 결선 | **열릴 전망** — `PlayerManager.BoostController.Boosts[BoostType.Equip]`·`TableManager.Equip` 의존 | 구 장비(`EquipBoost`) ↔ Survival 장비(`SurvivalItemCatalog`) **별개 시스템** | | **ShopScreen** | `UGUIShopView` = **빈 플레이스홀더** | 노드만 존재 | 열리지만 **원작에서도 비어 있음**(코드 주석 명시) — 구 UGUI 상점은 처음부터 미구현 | 없음. Survival 상점(9종)이 유일 구현체 | | **Header / MainMenu** | `UGUIHeaderView`·`UGUIMainMenuView` | `Header`·`MainMenu` 노드 | **열릴 전망** — 상시 표시. 5개 메뉴 버튼이 `MainMenuUIEvents`로 화면 전환 | 없음 | | **모달 — 가챠 결과** | `UGUIGachaResultModal`·`UGUIRewardCard` | `_modalPrefabs["GachaResultModal"]` 결선 | **열릴 전망** — `UGUIModalControllers` 이미 활성(order 10) | 재화 공유 | | **모달 — 가챠 확률** | `UGUIGachaProbabilityModal` | `_modalPrefabs["GachaProbabilityModal"]` 결선 | **열릴 전망** | 없음 | | **모달 — 영웅 상세/선택/프로필** | `UGUIHeroDetailModal`·`UGUIHeroSelectModal`·`UGUIHeroProfileModal` | `_modalPrefabs` 3키 **전부 결선** | **열릴 전망** | 없음 | | **모달 — 장비 상세** | `UGUIEquipmentDetailModal` | `_modalPrefabs["EquipmentDetailModal"]` 결선 | **열릴 전망** | 구 장비 시스템 소속 | | **모달 — 던전 입장** | `UGUIDungeonEnterModal` | 결선 | **열릴 전망** | ⚠ 입장 시 `LoadScene("Battle")`(`:135`) — 구 전투 씬 이탈 | **공통 충돌축(유일)** — 재화. 구 UGUI와 Survival 로비가 **같은 `CurrencyManager` 인스턴스**를 쓰고 저장은 `save.txt` 한 곳이다. 구 화면에서 뽑기·강화로 골드를 쓰면 **Survival 로비 골드가 실제로 줄어든다**(그 반대도 성립). 진행도(카드·룬·영웅 vs Survival 성장·장비·마스터리)는 파일이 분리돼 서로 오염되지 않는다. **미발견 항목** — 구 UGUI 스택에서 "카드 뽑기"의 실행 진입점은 CardScreen 이 아니라 **CardScreen ▸ Item 탭** 안에 있다(`gacha_button--1time`/`--10times`). PD 표현의 "카드 및 카드 뽑기 기능"은 동일 화면 한 곳에 모여 있다. ### 검증 - **Roslyn 실컴파일**(Unity 6000.3.19f1 `csc.dll` + `Library/Bee/artifacts/1900b0aE.dag/Assembly-CSharp.rsp`, `-out`/`-refout`만 스크래치패드로 리다이렉트해 **Unity 빌드 산출물 무접촉**): **에러 0 · 경고 6 · exit 0 · DLL 생성 확인**. 감사 I2·I3 정정 후 **재컴파일 동일 결과**(에러 0·경고 6·동일 집합) - 경고 6건 전문 요지 (**전부 기존 파일 — 본 변경발 경고 0**, 2026-08-24 §108 기저선과 동일 집합): - `Singleton.cs(52,40)` CS0618 `Object.FindObjectOfType(Type)` obsolete - `Singleton.cs(54,29)` CS0618 `Object.FindObjectsOfType(Type)` obsolete - `Singleton.cs(10,29)` CS0414 `applicationIsQuitting` assigned but never used - `UGUIBattleSceneUIController.cs(112,17)` CS0618 `Object.FindObjectOfType()` obsolete - `UGUILobbySceneUIController.cs(152,17)` CS0618 `Object.FindObjectOfType()` obsolete - `SurvivalLobbyController.cs(97,17)` CS0618 `Object.FindObjectOfType()` obsolete - rsp 정합 확인: `SurvivalLobbyController.TempNav.cs`(L591)·`UGUILobbySceneUIController.cs`(L640)·`UGUIView.cs`(L661) 모두 소스 목록 포함. `Assets/Script/` 하위에 asmdef 없음 → 동일 `Assembly-CSharp` = `UGUIView.FindDeep`(internal) 접근 가능 확증 - Unity 에디터 콘솔 조회(MCP 읽기 전용·`GodDem@23bbe4a1`) error/warning **0건**. **단 이 값은 본 변경의 근거가 아니다** — `Library/ScriptAssemblies/Assembly-CSharp.dll` 타임스탬프 01:37 < 소스 수정 01:53 = **에디터가 아직 재컴파일하지 않은 상태**. 본 변경의 컴파일 근거는 위 Roslyn 실컴파일 단독(C23) ### 미검증 (C23 태그 — pm-auditor 질의 4 지정 6종 + 개발팀장 추가 2종) 1. 구 UGUI **초기화 성공 여부·각 화면 정상 표출** — Play 제어 금지로 런타임 확인 불가. 실태표 ③열은 전부 소스 근거 판정 2. **"GodDem 캔버스를 꺼야 보인다"는 sortingOrder 정적 추론** — `overrideSorting`·sortingLayer·카메라 구성은 미확인. 다만 어긋나더라도 복귀 버튼(order 500)이 살아 있어 갇히지 않는다 3. 프리팹 노드 8종의 **런타임 탐색 성공** — 직렬화 참조 유효 ≠ `Rect()`/`FindDeep` 탐색 성공 4. 구 UI 하위 기능(카드뽑기·영웅)의 **실동작** 5. **모달(order 10)·토스트(order 20) 캔버스는 포착 대상 밖** — `UGUIModalControllers`·`UGUIToastControllers`는 활성화 전부터 씬 루트에 있어 `beforeRoots` 차집합에 걸리지 않는다. 따라서 복귀 시에도 계속 활성으로 남는다. **의도적 선택**(C19 — 본 변경 이전부터의 씬 상태를 건드리지 않음). GodDem 캔버스(order 100)가 둘 다 덮으므로 시각·입력 영향은 없다고 판단하나 **미검증** 6. 세이브 분리(`save.txt` ↔ `survival_meta.json`)로 인해 구 UI 가 표시할 **데이터 상태** 7. `TnFirstActivateLegacy()`의 예외 포착이 실제로 무엇을 잡아낼지 — 특히 `UGUIContentsView`의 `TableManager.ExtraContents` 무가드 인덱싱 8. 복귀 오버레이 버튼(우상단 240x72)이 구 UI Header 와 시각적으로 겹치는지 — 겹쳐도 order 500 이라 **클릭은 항상 가능**하나 해당 모서리가 가려질 수 있음 ### pm-auditor 사전 감사 판정과 조치 (판정 도착 — 인용 가능) 발주 후 판정 도착. **Critical 0 · Major 3 · Minor/Improvement 5**. Major 전건 수용·정정 완료. | 지적 | 판정 | 개발팀장 조치 | |------|------|-------------| | **M1** C6-1 백업 파일명 표준 위반(`.cs` 확장자 탈락) | **수용 — 감사관이 옳다** | 실측으로 재확인: 동 디렉토리의 비-`.cs` 백업은 **전건** 원본 확장자 보존(`A10_bunsin.asset.bak_….asset`·`SurvivalBattle.unity.bak_….unity`·`survival_meta.json.bak_….json`·`SurvivalUpgrade.csv.bak_….csv`), `.cs` 도 `…_0352` 이후 일관되게 `.cs.bak_`. 즉 `{원본명}` = **확장자 포함 전체 파일명**이 정확한 해석. 본 건이 구 위반형을 답습했다. **2건 rename 완료** — `SurvivalLobbyController.TempNav.cs.bak_20260825_0200.cs` / 전 세션분 `SurvivalLobbyController.cs.bak_20260825_0123.cs` | | **M2** P19·C13 PD 지시 로그 미등록 | **수용** | `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT13-GodDem 행에 세그먼트 **소급 등재 완료**(백업 선행·셀 경계 파싱 후 삽입·표 구조 무결 검증 `pipe count 8`·62행 유지). 본 §110 은 PD 원문 인용으로 시작 | | **M3** C35-11 오적용 | **수용·기록** | **C35-11 (a) 미충족 확인** — 본 건에 plan-auditor 모드A 설계 감사 선행 없음. 또한 (d)는 *main push* 상태를 규율하므로 GodDem 로컬 커밋에는 비해당. **본 건은 C35-1 #2 원칙 그대로**(사전 호출 + 판정 수령 후 집행)이며 실제로 판정 수령 후 커밋했다. 신설 조항의 외연 확대 해석 선례가 굳지 않도록 여기 명기 | | **I1** 커밋 경로 한정 | 수용 | Unity 자동 터치 `.asset` 6종이 dirty. `git add -A` 미사용 — **단일 경로 명시 스테이징** | | **I2** 캔버스 포착 실패 시 버튼 영구 무력화 | **수용 — 실코드 결함** | 실재 버그였다. `_tnLegacyActivated`가 true 라 재클릭이 빈 리스트에 `TnSetLegacyVisible`만 돌던 경로를 분리. 활성화 직전 씬 루트 스냅샷을 `_tnRootsBeforeLegacy` 필드로 보존해 **재클릭마다 포착 재시도**하도록 수정 | | **I3** C2 proxy 축 1개 누락 | 수용 | 헤더 C2 절을 2축으로 개정 — 축1(GodDem 정식 IA 배치) + **축2(구 UGUI 기능의 GodDem 신 UI 재이식)**. 본 버튼은 축2 의 **진단용 proxy**임을 명기 | | **I4** 완료 보고 표현 제약 | 수용 | 본 산출물은 PD 원문 "되살리라"를 **이행하지 않는다**. 도달점 = **진입 경로 확보 + 동작 실태 관측 가능 상태**이며 **재이식 미착수**. "기능 복구 완료"류 표현 사용 금지 | | **I5** 서술 정밀도 | 수용 | 정확한 표현은 "Unity 는 `OnEnable` 내부 예외를 **콘솔에 남기되** `SetActive` 호출부로 전파하지 않는다" — 삼키는 것이 아니라 로그로 남기기 **때문에** 훅이 작동한다. 코드 주석·본 문서 모두 이 표현으로 통일 | **감사관 지적 중 사실 정정 2건(개발팀장 → 감사관)**: ①sortingOrder 100 은 `SurvivalLobbyController.cs:84`(감사관 :85) — 주석 줄 기준 차이. ②감사관이 "누락"으로 표기한 `OnDestroy` 존재는 결론에 영향 없음(활성 상태에서 `OnDestroy`는 호출되지 않으므로 SetActive 왕복 시 중복 생성 문제는 그대로 성립). ### PD 안내 (필수) 1. **사용법** — 로비 좌측 "임시 메뉴" 맨 아래 청록색 **"구 아웃게임"** 클릭 → 구 UGUI 아웃게임 표시. 우상단 **"GodDem 로비로"** 클릭 → 원래 로비 복귀(직전 화면 그대로 보존). 2. **재컴파일** — 기존 `.cs` 수정이므로 도메인 리로드가 발생한다. **진행 중이던 Play 세션은 끊긴다.** Play 중지 → 재생 1회 필요(자동 리프레시가 안 걸리면 Ctrl+R). 3. **구 로비의 "시작" 버튼 주의** — `Battle` 씬으로 이동한다(GodDem 전투 `SurvivalBattle` 아님). 눌러서 씬이 바뀌면 Lobby 씬으로 돌아온 뒤 임시 메뉴부터 다시 눌러야 한다. 4. **골드·젬은 양쪽이 같은 지갑이다.** 구 화면에서 뽑기·강화로 소비하면 Survival 로비 재화가 실제로 줄어든다. 재활용 여부 판단 시 이 축만 유일한 실질 충돌이다. 5. **초기화 예외가 나면** 우상단 복귀 버튼 아래에 붉은 글씨로 "초기화 예외 N건"이 뜬다. Console 원문을 그대로 남겨 뒀으니 그 내용을 알려 주시면 복구 범위를 판정한다. **임의 수정은 하지 않았다**(PM 지시 준수). ### 규칙 준수 - **C35-1 #2** — pm-auditor **사전 호출 + 판정 수령 후 커밋**(매니페스트 `2026-08-25_0200`, target `GodDem:Assets/Script/Survival/SurvivalLobbyController.TempNav.cs`). C35-11 갈음 **비적용**((a) 설계 계층 plan-auditor 모드A 감사 선행 없음). (d) 3요건은 *main push* 규율이라 로컬 커밋에 **비해당** — 발동하지 않았고 인용할 미도착 판정도 없다(M3 정정 반영) - **C2** — 본 전환은 **proxy(임시)**다. 원 파일 헤더 주석의 철거 계약(파일 삭제 + `Start()` 호출 1줄 제거)은 그대로 유효하다. 근본 해결 = PD 가 재활용 대상을 확정한 뒤 해당 기능을 정식 IA 에 배치하는 것 - **C6** — 백업 2종 표준 경로·표준 파일명(확장자 포함)·gitignore 확증 - **C19** — 구 UGUI 화면 코드 **수정 0건** 확증(`git diff HEAD~1 HEAD --name-only | grep -c "Assets/Script/UGUI/"` = **0**). 접근 경로만 신설. 커밋 파일 목록 1건·`.unity`/`.prefab` **0건** - **PM 인계 사항** — 매니페스트 `2026-08-25_0200`은 `.claude/manifest/active/`에 **잔존**한다. `manifest_archive.sh`는 BT 레포 HEAD 커밋 파일과 cross-check 하는데 본 집행의 커밋은 GodDem 레포에 있고 BT 커밋은 PM 영역이라 아카이브 조건이 성립하지 않았다. BT 커밋·push 시 자동 이동 예상. 활성 매니페스트는 편집을 **허용**하는 쪽이라 잔존 자체가 차단을 일으키지는 않는다 ## 111. 구 UGUI 아웃게임 전환 push·실태표 확보 (PM·2026-08-25) - **PM push**: GodDem `5403caa..af78882` origin 반영 — 임시 메뉴에 "구 아웃게임" 전환 + "GodDem 로비로" 복귀(별도 캔버스 order 500·컨트롤러 자식) - **설계 재정의 3건(개발팀장 씬 실측 — PM 지시안 보정)**: ①구 컨트롤러 씬 직렬화 `_canvas`·`_uiRoot` **둘 다 null** → 활성화 시 sortingOrder 0 캔버스 자체 생성 = **SetActive만으로는 GodDem(100) 아래라 안 보임**·GodDem 캔버스 차단 필수 ②`UGUILobbySceneUIController`는 `OnEnable` 초기화·`OnDisable` 부재 → SetActive 왕복 시 4.2MB 프리팹 중첩·이벤트 구독 누적 → **최초 1회만 SetActive·이후 canvas.enabled 토글** ③`UGUIView` 생성자 예외는 Unity가 콘솔에만 남기고 전파 안 함 → `Application.logMessageReceived` 훅으로 원문 회수(임의 수정 0) - **숨김 방식**: `canvas.enabled=false`+`GraphicRaycaster.enabled=false` 채택 / `SetActive(false)` 기각(코루틴·Selectable 리셋·TMP 재레이아웃 부작용·복귀 시 직전 화면 보존 불가). 캔버스 포착 실패 시 **전환 취소**(빈 화면 갇힘 방지) - **★ 화면별 실태표 확보**(PD 재활용 결정 근거·③열은 전부 소스 판정·런타임 미검증): LobbyScreen ○(단 시작 버튼이 `LoadScene("Battle")` = 구 전투 씬) / UpgradeScreen ○(강화·진화) / ContentsScreen ⚠(`TableManager.ExtraContents[...]` 무가드 인덱싱 — 실패 시 OnEnable 전체 중단) / **CardScreen ○ = PD 지목 본체**(Item 탭 = **카드뽑기**·`GachaController.GachaTrackers[CARD_GACHA_ID]`·구/신 가챠 완전 분리 / Skill 탭 = **원작부터 빈 플레이스홀더** / Rune 탭 ○ / **Hero 탭 ○ = 영웅**·`BoostController.Boosts[Equip]`) / ShopScreen = **원작부터 미구현** / 모달 15종 전량 결선·`UGUIModalControllers` 이미 활성 - **유일 실질 충돌 = 재화**: `PlayerManager.GetUserData()`가 `CurrencyManager.GetSavedData()` 포함 — 구 화면 소비가 **Survival 골드를 실제 차감**. 진행도는 `save.txt` ↔ `survival_meta.json` 분리라 오염 없음 - **누락 정정**: "카드 뽑기"는 CardScreen이 아니라 **CardScreen ▸ Item 탭** 내부 — PD 지목 "카드 및 카드 뽑기"는 동일 화면 한 곳 - **감사 Major 3 전건 수용**: M1 백업 파일명 재발 2건 rename(교훈 메모리 재발 기록 갱신) / M2 PD 지시 로그 소급 등재 / **M3 C35-11 오적용 정정** — 본 건은 plan-auditor 모드A 선행 없음·(d)는 main push 규율이라 로컬 커밋 비해당 → **C35-1 #2 원칙 그대로**(실제 판정 수령 후 커밋). **신설 조항 외연 확대 선례 방지 명기** - 검증: Roslyn 에러 0·경고 6(전부 기존 파일·본 파일발 0·기저선 동일). 에디터 콘솔 0건은 미재컴파일 상태라 근거 아님(정직 표기) ## 112. 임시 메뉴 재구성 — 과거 UGUI 아웃게임 전용 진입점화 (개발팀장, GodDem 로컬 커밋 `cf8cd19`) > **PD 원문 (2026-08-25)**: "기존 메뉴가 하나도 안보이는데? 내가 시킨건 임시 메뉴에 과거 메뉴가 발생되도록 해달라고 했는데 네가 새로 구현한 UI가 중복해서 노출되고 있잖아" ### 결정 임시 메뉴의 역할을 **하나로 좁힌다** — "과거 UGUI 아웃게임 5개 화면으로 가는 직행 통로". Survival 신규 시스템 버튼은 전량 제거한다. | | 직전 (`af78882`) | 본 건 (`cf8cd19`) | |---|---|---| | 버튼 구성 | Survival 신규 7종 + "구 아웃게임" 1종 | **구 UGUI 직행 9종** (신규 0종) | | 과거 화면 도달 | 8번째 버튼 1개 뒤에 숨음 | **9개 버튼이 전부 과거 화면** | | 화면 지정 | 불가 (구 로비 첫 화면 고정) | 5화면 + 카드 4탭 **개별 직행** | **최종 버튼 목록 (위→아래)**: 로비 / 카드 / └ 아이템 (카드뽑기) / └ 영웅 / └ 룬 / └ 스킬 (원작 미구현) / 강화 / 컨텐츠 / 상점 (원작 미구현) ### 근거 - **중복의 실체** — 제거한 7종은 이미 로비·영웅 패널에 자체 진입 경로가 있다. 임시 메뉴에 다시 두는 것은 같은 기능의 2번째 입구일 뿐이고, PD 화면에서는 "새로 만든 UI가 겹쳐 보이는" 현상으로 나타난다. - **전환 경로 = 구 하단 메뉴와 동일** — `MainMenuUIEvents.{Lobby|Card|Upgrade|Contents|Shop}ScreenShow` 는 `public static Action` 이고(`Assets/Script/UI/Events/MainMenuUIEvents.cs` L6-10), 구 하단 메뉴 `UGUIMainMenuView` L54-58 이 **바로 그 이벤트를 Invoke** 한다. 따라서 임시 메뉴에서 같은 이벤트를 쏘는 것은 구 메뉴 클릭과 **동일 경로**다. 리플렉션 0·구 컨트롤러 신규 public API 0. - **카드 탭 직행** — `UGUICardView.OnTabClicked` 는 private 이지만 탭 `Button.onClick` 은 public. 탭 노드를 `UGUIView.FindDeep` 으로 찾아 `onClick.Invoke()` 하면 정식 클릭과 동일 핸들러를 탄다(`GetComponent