BurningTimesAi/공유/대화로그/GodDem/2026-08-25.md

43 KiB

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 ★신규 UGUILobbySceneUIControllerAwake/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<UGUILobbySceneUIController>() + 씬 소속 필터
    • 캔버스 포착 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<T>() obsolete
    • UGUILobbySceneUIController.cs(152,17) CS0618 Object.FindObjectOfType<T>() obsolete
    • SurvivalLobbyController.cs(97,17) CS0618 Object.FindObjectOfType<T>() 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.txtsurvival_meta.json)로 인해 구 UI 가 표시할 데이터 상태
  7. TnFirstActivateLegacy()의 예외 포착이 실제로 무엇을 잡아낼지 — 특히 UGUIContentsViewTableManager.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 캔버스 차단 필수 ②UGUILobbySceneUIControllerOnEnable 초기화·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.txtsurvival_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}ScreenShowpublic 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<Button>() null 가드 포함). FindDeepTransform.GetChild 재귀라 비활성 자식도 찾는다.
  • "원작 미구현" 병기의 근거UGUIShopView·UGUISkillContentView둘 다 15줄 · 본문 0(생성자만). 원작 ShopView·SkillContentView 와 동일한 빈 플레이스홀더다. 눌러도 빈 화면인 것이 정상이라는 사실을 라벨에 남겨 버그 오인을 차단한다.

기각안 (C32)

기각안 기각 사유
Survival 신규 7종 존치 (구 UGUI 버튼만 추가) PD 지적의 대상이 바로 그 7종의 중복 노출이다. 존치하면 지적을 해소하지 못한다. 또한 버튼이 16개가 되어 패널 세로 한계(BannerFrame03 하단 1629)를 넘는다
구 컨트롤러에 public void OpenScreenByName(string) 신규 추가 구 UI 코드 수정 = 원작 보존 원칙 위반. MainMenuUIEvents 로 리플렉션 없이 도달 가능하므로 불필요
리플렉션으로 OpenScreen(_cardView) 직접 호출 위와 같은 이유로 불필요. 필드명 변경에 취약하고 정식 클릭 경로와 갈라진다
씬(.unity) m_IsActive 를 1 로 되돌리기 PD 가 에디터로 테스트 중 — .unity/.prefab 편집 금지. 런타임 SetActive(true) 로 대체(씬 파일 원본 유지)
패널을 아래로 늘려 9칸 확보 아래변 720 은 로비 Shadow 상단 713 과 7px 여유뿐. 대신 버튼 높이 86→72·피치 96→80 으로 축소해 기존 대역 안에 수용

★ 런타임 실검증 (직전 3회는 컴파일까지만 검증 — 본 건이 최초 실행 검증)

Play 진입 → 검증 → stop 완료. 씬·프리팹·에셋 저장 0건 (scene.isDirty=False 확인).

1. 임시 메뉴 렌더 실측TempNavPanel activeInHierarchy=True, size (226, 860), 화면 좌표 BL=(12,720) TR=(238,1580) (BannerFrame03 하단 1629 침범 없음). 자식 실측 = Header + 버튼 9종 + Footer. Survival 신규 버튼 0건.

2. "카드" 버튼 클릭 경로 (PD 지목 본체)Btn_카드.onClick.Invoke() 실행 결과:

항목 BEFORE AFTER
UGUIUIControllers activeSelf False True
씬 루트 UGUICanvas 없음 신규 생성 · enabled=True · order 0
SurvivalLobbyCanvas enabled True (order 100) False
TempNavLegacyOverlay 비활성 활성 · order 500
클릭 중 예외 0건

3. 실제로 화면에 뜬 것UGUICanvas ▸ MainDocument(Clone) ▸ safe-area ▸ [background, Header, ScreenView, MainMenu] 계층 실측:

LobbyScreen   self=False   UpgradeScreen self=False   ContentsScreen self=False
CardScreen    self=True   ← 실제 표시 화면          ShopScreen     self=False
MainMenu      self=True    Header        self=True   (구 상단바·하단 메뉴 동시 표시)
content--item self=True    content--skill/rune/hero = False  ← 기본 Item(카드뽑기) 탭

구 UGUI 카드 화면이 실제로 화면에 떴다. 다른 화면 동시 노출 0건.

4. 9버튼 전건 클릭 실측 (각 클릭 후 활성 화면·탭 스냅샷 · 신규 에러 전건 0)

버튼 결과 에러
└ 영웅 SCREEN:CardScreen TAB:content--hero 0
└ 룬 SCREEN:CardScreen TAB:content--rune 0
└ 스킬 SCREEN:CardScreen TAB:content--skill 0
강화 SCREEN:UpgradeScreen 0
컨텐츠 SCREEN:ContentsScreen 0
상점 SCREEN:ShopScreen 0
로비 SCREEN:LobbyScreen 0
└ 아이템 SCREEN:CardScreen TAB:content--item 0

5. 복귀·왕복 — "GodDem 로비로" 클릭 → GodDemCanvas enabled=True / UGUICanvas enabled=False / 오버레이 비활성. UGUIUIControllers켠 채 유지(캔버스만 토글). 재진입 2회차 MainDocument(Clone) 개수 1 → 1 = 중복 인스턴스화 0. 복귀 오버레이 Status 텍스트 = 빈 문자열(초기화 예외 0건).

구 UGUI 미표시 원인 — 규명 결과

본 건에서는 미표시가 발생하지 않았다(위 실측대로 실제 표시됨). 다만 "왜 안 뜰 수 있었는가"의 구조는 씬 직렬화 실측으로 확정했다 — Lobby.unity L762~770:

UGUIUIControllers  m_IsActive: 0                    ← 씬에서 꺼져 있음
_canvas: {fileID: 0}   _uiRoot: {fileID: 0}         ← 둘 다 미결선
_mainDocumentPrefab: MainDocument.prefab (결선 정상)
_styleTheme: UGUIStyleTheme.asset (결선 정상)

_canvas 가 null 이라 EnsureCanvas() 가 캔버스를 새로 만들고 sortingOrder 는 기본값 0. GodDem 로비 캔버스는 100 이므로 켜기만 해서는 100 아래에 깔려 영원히 안 보인다. GodDem 캔버스를 끄는 것이 표시의 필요조건이며, 본 코드가 그것을 수행한다(실측 SurvivalLobbyCanvas enabled=False).

경쟁 캔버스 실측 — MainCanvas(order 0, 자식 0개UGUIRoot(order 0, 활성 그래픽 0개)로 표시 내용이 없고, UGUICanvas 는 씬 루트 중 siblingIndex 21(최후미)이라 동순위 중 최상단에 그려진다. 가림 요소 없음.

감사 지적 대응 (pm-auditor 사전 감사 — 매니페스트 2026-08-25_1047)

지적 판정 조치
C-1 전제(af78882 미표시) 미검증 상태의 전면 재설계 부분 수용 감사관 지적대로 "PD가 버튼을 못 본 이유"는 두 갈래였다. 런타임 실검증으로 확인한 사실: af78882 의 전환 로직은 정상 동작한다. 따라서 본 건의 성격은 **"동작 실패의 수정"이 아니라 "진입점 1개 → 9개 확장 + 신규 7종 제거"**다. 커밋 메시지·본 엔트리 모두 이 표현으로 통일했다
M-1 신규 PD 지적 미등재 (3회차) 수용 공유/PD_지시_트래킹/개발팀_PD_지시_로그.md BT13-GodDem 행에 PD 원문 인용으로 등재 완료(표 무결 검증 pipe count 8·1행 in/out)
M-2 git 추적 영역 백업 불요 기록 · 미적용 감사관 논지(백업 자체가 불요, 롤백은 git checkout)는 타당하다. 다만 ①PM 발주서가 백업을 명시 지시했고 ②백업 위치가 Unity 프로젝트 밖(E:\BurningTimes\공유\개발팀_백업\GodDem\)이라 감사관이 우려한 CS0111 중복 멤버 컴파일 오염은 발생하지 않는다(Assets/ 내부가 아님). 파일명은 표준 준수 SurvivalLobbyController.TempNav.cs.bak_20260825_1043.cs. 롤백 경로: git checkout af78882 -- Assets/Script/Survival/SurvivalLobbyController.TempNav.cs. 백업 존치/폐지 방침은 PD·PM 결정 영역으로 상신
M-3 매니페스트 미등록 수용 편집 착수 후 인지 → manifest_register.sh2026-08-25_1047 등록 완료
T-1 MainMenuUIEvents 이중 구독 → 두 화면 동시 노출 위험 수용 · 실측 해소 감사관 지적대로 UI Toolkit LobbySceneUIController L109-113 이 같은 이벤트를 구독한다. 씬 실측: 해당 UIControllers 오브젝트는 m_IsActive: 0(Lobby.unity L1806~1822) → OnEnable 미실행 → 구독 자체가 발생하지 않는다. 런타임 실측에서도 활성 화면은 항상 1개뿐이었다. 단 씬에서 UIControllers 를 켜면 이 위험이 즉시 실현된다 — PD·PM 인계 사항
T-2 버튼 증가에 따른 레이아웃 한계 초과 수용 · 반영 버튼 높이 86→72·피치 96→80 으로 축소. 패널 상단 1580 < BannerFrame03 하단 1629 (여유 49px, 직전 13px 대비 개선). 실측 좌표로 확증
T-3 빈 화면 버튼 = PD 재지적 직결 수용 · 반영 상점·카드 스킬 탭 버튼에 "(원작 미구현)" 병기 + 전용 색상 분리. 소스 실측으로 근거 확인(양 클래스 15줄·본문 0)
T-4 ContentsScreen 무가드 인덱싱 크래시 위험 수용 · 실측 결과 미발생 런타임에서 컨텐츠 버튼 클릭 시 예외 0건, SCREEN:ContentsScreen 정상 전환. 위험 자체는 코드에 잔존하므로(데이터 상태 의존) 기록만 남긴다
T-5 탭 노드 Button 여부 미확인 수용 · 가드 포함 GetComponent<Button>() null 가드 후 onClick.Invoke(). 런타임에서 4탭 전건 정상 동작 확인

감사관 C14-7 경고 준수 — 스크린샷 0장 사용. 좌표·활성 상태·계층·캔버스 order 전부 텍스트 실측으로 처리했다.

코드 변경 요지

  • TnEnterLegacyOutgamebool 반환으로 변경. 전환 실패 시 화면 전환 이벤트를 쏘지 않는다. (실패 상태로 이벤트만 쏘면 OpenScreen_currentView == view 가드에 걸려 다음 진입이 영구 무반응이 되는 함정 — 사전 차단)
  • TnGoLegacy(showScreen, tabNodeName) 공통 경로 신설 — 전환 → 화면 → 탭 3단.
  • TnClickLegacyTab(name) 신설 — 탭 Button 탐색·null 가드·onClick.Invoke(). 미발견 시 화면은 유지하고 복귀 오버레이에 사실 표기.
  • 제거: TnOpenHeroChild · TnOpenGachaTabs (Survival 신규 시스템 전용 — 중복 노출원).

검증

  • 컴파일: CompilationPipeline.RequestScriptCompilation(CleanBuildCache) clean rebuild 수행 → error CS 0건. TempNav.cs 를 인용한 진단 0건(grep 실측).
  • 잔존 경고 요지(전부 기존 파일·본 파일발 0·기저선 동일) — 게임 코드측 CS0618/CS0414 6종 원문 인용:
    • Assets\Script\Core\Patterns\Singleton.cs(10,29): warning CS0414: The field 'Singleton<T>.applicationIsQuitting' is assigned but its value is never used
    • Assets\Script\Core\Patterns\Singleton.cs(52,40): warning CS0618: 'Object.FindObjectOfType(Type)' is obsolete
    • Assets\Script\Core\Patterns\Singleton.cs(54,29): warning CS0618: 'Object.FindObjectsOfType(Type)' is obsolete
    • Assets\Script\Survival\SurvivalLobbyController.cs(97,17): warning CS0618: 'Object.FindObjectOfType<T>()' is obsolete
    • Assets\Script\UGUI\UGUILobbySceneUIController.cs(152,17): warning CS0618: 'Object.FindObjectOfType<T>()' is obsolete
    • Assets\Script\UGUI\UGUIBattleSceneUIController.cs(112,17): warning CS0618: 'Object.FindObjectOfType<T>()' is obsolete
    • 그 외는 전부 Assets\Spine\** 외부 패키지발.
  • 런타임 에러 1건은 본 건 무관 · 기존 결함Error loading asset bundle from E:/NerdNavis/GodDem/Assets/StreamingAssets\StandaloneWindows\csv: HTTP/1.1 404 Not Found. 실측으로 Assets/StreamingAssets/StandaloneWindows 디렉토리 자체가 부재(Directory.Exists=False) 확인 — BaseLoading 단계 기존 이슈.
  • C19 구 UGUI 무수정 확증: 커밋 파일 1건(SurvivalLobbyController.TempNav.cs)만. Assets/Script/UGUI/ 0건, .unity/.prefab 0건.
  • 씬 무변경 확증: Play 종료 후 EditorSceneManager.GetActiveScene().isDirty=False.

PD 안내

  1. 사용법 — 로비 좌측 "과거 메뉴" 패널(분홍 헤더). 9개 버튼이 전부 과거 UGUI 화면이다. 아무거나 누르면 즉시 그 화면으로 간다. 복귀는 우상단 "GodDem 로비로" 하나뿐(직전 화면 그대로 보존).
  2. 재컴파일 필요 — 기존 .cs 수정이라 도메인 리로드가 발생한다. 진행 중이던 Play 세션은 끊긴다. Play 중지 → 재생 1회(자동 리프레시가 안 걸리면 Ctrl+R). 단 본 세션에서 이미 컴파일까지 완료해 두었다.
  3. "(원작 미구현)" 2종은 눌러도 빈 화면이 정상 — 상점·카드 스킬 탭. 원작부터 본문이 없는 플레이스홀더이며 버그가 아니다.
  4. 구 로비의 "시작" 버튼 주의Battle 씬으로 이동한다(GodDem 전투 SurvivalBattle 아님). 씬이 바뀌면 Lobby 로 돌아온 뒤 과거 메뉴부터 다시 눌러야 한다.
  5. 골드·젬은 양쪽이 같은 지갑 — 구 화면에서 뽑기·강화로 소비하면 Survival 로비 재화가 실제로 줄어든다. 재활용 판단 시 이 축이 유일한 실질 충돌이다.
  6. 본 패널은 여전히 임시(proxy) — 도달점은 "무엇이 살아 있는지 눈으로 확인"까지다. 기능 재이식은 하지 않았고 구 UI 코드도 수정 0건이다. PD 가 재활용 대상을 확정하면 그때 GodDem 신 UI 로 이식한다.

PM 인계

  • push 미실시cf8cd19 는 GodDem 로컬 커밋까지. push 는 PM 영역(지시 준수).
  • BT 레포 커밋 미실시 — 본 엔트리·PD 지시 로그 갱신분은 작업 트리 상태로 둔다(지시 준수).
  • 매니페스트 2026-08-25_1047 잔존manifest_archive.sh 는 BT HEAD 커밋과 cross-check 하는데 본 집행 커밋은 GodDem 레포에 있어 조건 미성립. BT 커밋·push 시 자동 이동 예상.
  • 감사 M-2 상신 안건 — "git 추적 영역 코드의 백업 존치/폐지" 방침. 감사관은 폐지(롤백 = git checkout)를 권고했고 PM 발주서는 백업을 지시했다. 규칙 방향 수준이라 PM·PD 결정 영역(C36).
  • T-1 잠재 위험 기록 — 씬에서 UI Toolkit UIControllers(m_IsActive: 0)를 켜면 MainMenuUIEvents 이중 구독으로 두 스택이 동시에 화면을 띄운다. 현재는 꺼져 있어 무해하나, 향후 UI Toolkit 측을 되살릴 경우 본 임시 메뉴가 이중 노출을 유발한다.

113. 임시 메뉴 과거 메뉴 재구성 push — 런타임 실검증 최초 성공 (PM·2026-08-25)

  • PM push: GodDem af78882..cf8cd19 origin 반영. 임시 메뉴 = "과거 메뉴" 9종(로비·카드·└아이템(카드뽑기)·└영웅·└룬·└스킬(원작 미구현)·강화·컨텐츠·상점(원작 미구현)) + 복귀 1. Survival 신규 7종 전량 제거(PM 지시 오류로 만든 중복 노출 해소)
  • ★ 런타임 실검증 최초 수행(4회 연속 코드·컴파일 한정 검증 관행 종결): Play 진입→9버튼 전건 클릭→stop. 예외 0건. 카드 클릭 시 UGUIUIControllers activeSelf False→True·UGUICanvas 신규 생성(order 0)·SurvivalLobbyCanvas enabled=False·계층 실측 CardScreen self=True/나머지 4화면 False/content--item 활성 = 구 UGUI 카드 화면 단독 표시·중복 0. 탭 4종 각각 정확 전환·왕복 2회차 MainDocument(Clone) 1 유지(중복 인스턴스화 0)
  • 전환 기전: 리플렉션·신규 public API 불요 — 구 하단 메뉴 UGUIMainMenuView L54-58이 쏘는 MainMenuUIEvents.*ScreenShow 정적 이벤트를 그대로 Invoke. 탭은 Button.onClick.Invoke() = 정식 클릭과 동일 핸들러
  • 표시 필요조건 확정: 씬 직렬화 _canvas/_uiRoot 둘 다 fileID 0 → EnsureCanvas()가 order 0 캔버스 생성 → GodDem(100) 아래 영구 매몰. GodDem 캔버스 차단이 표시의 필요조건(코드가 수행). 경쟁 캔버스 가림 요소 0 확인
  • PM 인계 (T-1): UI Toolkit LobbySceneUIController동일 이벤트를 구독 — 씬의 UIControllers(m_IsActive 0)를 켜는 순간 두 화면 동시 표시. 구 UI Toolkit 스택 취급 결정 시 선행 확인 필요
  • 프레이밍 정정 (C-1): af78882 전환 로직은 정상 동작이었음 — 본 건은 "동작 실패 수정"이 아니라 진입점 1→9 확장 + 신규 7종 제거. PD 미표시 체감의 실제 원인 = 임시 메뉴에 과거 메뉴 진입점이 사실상 1개뿐이었던 PM 구성 오류
  • 검증: clean rebuild error CS 0·TempNav 발 진단 0·잔존 경고 기저선 동일. 런타임 에러 1건은 기존 StreamingAssets/csv 404(디렉토리 자체 부재)