BurningTimesAi/공유/대화로그/FirstRising/2026-09-24_UI작업_인수인계.md

12 KiB

FirstRising UI 작업 인수인계 (2026-09-24 · BT18)

다음 세션에서 ① 일일 도전 진입 시 에디터 충돌 추적 → ② UI 기능 구현 계속을 하기 위한 문서. 이 문서 하나만 읽으면 이어갈 수 있게 적었다.


0. 지금 상태 한 줄

UI 기능(인벤토리·장비·플레이어 정보·성장(스킬/강화)·특성·컨텐츠·길드 토스트·창 타이틀바)은 bt/work 에 커밋·푸시 완료(be0218b636). 2026-09-24 오전 세션 2: 컨텐츠 오른쪽 · 테르티스의 가호 → 일일 도전 · 일일 도전 복귀 무한 로딩 수정 3건 · 진단 도구 2종을 af5813a128 로 커밋·푸시 완료. 일일 도전 진입 에디터 충돌은 09:09 에디터 재시작 이후 재현되지 않았다(진입 4회 정상) — 원인 미확정(§3). 다음 과제는 §6.

1. 저장소 · 실행 환경

항목 값
프로젝트 C:\BurningTimes\FirstRising · 브랜치 bt/work (원격과 동일 be0218b636 + 미커밋)
Unity 6000.3.9f1 · CLI 포트 7800 (unity command eval ... --project-path 'C:\BurningTimes\FirstRising')
에디터 로그 %LOCALAPPDATA%\Unity\Editor\Editor.log / Editor-prev.log (충돌 세션은 prev 쪽)
ComfyUI Comfy Desktop C:\Comfyui\Comfy Desktop\Comfy Desktop.exe → API http://127.0.0.1:8000 (NoobAI XL)
TBH 추출 데이터 E:\BurningTimes\scratchpad\TBH_v1.2.4\ (textassets CSV · localization strings_ko_en.csv)

2. 규칙 (PD 지시)

  1. 스크립트(MonoBehaviour)는 Lobby/LobbyPlayScene/BT_Visual 노드에만 붙인다. 프리팹 설정값은 Assets/GameAssets/LobbyPlayScene.prefab 을 SerializedObject 로 바꾼다(--detach 로 실행, 결과는 파일로)
  2. 게임 원본 프리팹 수정 금지(복사본 사용). 게임 코드 수정은 허용하되 날짜·이유 한글 주석 필수
  3. 자잘한 결함은 묻지 말고 고친다. 승인이 필요하면 질문으로 끝낸다. 끝나기 전에 턴을 끝내지 않는다
  4. 커밋·푸시는 PD 지시 시만(bt/work 만. master 는 별도 지시)
  5. Play 규칙: 재컴파일 전 EditorApplication.isPlaying 을 단독으로 확인한다. editor_play 가 "Already in play mode" 를 돌려주면 PD Play 다 — 절대 조작하지 않는다. 내가 띄운 Play 는 검증 후 바로 끈다
  6. 보고는 한국어·간결·경어, 호칭 PD님. 세션 기록이 커지므로 스크린샷은 최소(값 검증 우선)

3. 【최우선】일일 도전 진입 시 에디터 충돌

재현

하단 컨텐츠 → 오른쪽 강화(훈련) 메뉴 → 테르티스의 가호 카드(투명 덮개 TV_DailyChallengeHit) → GameHub.StartGame(일일 도전 맵) 성공 → LobbyScene.StartGame → Loading → Graveyard_SubScene 스트리밍 직후 에디터 종료(Unity Bug Reporter). PD·PM 모두 3회 이상 재현.

충돌 스택(Editor.log 실측)

BatchRendererGroup.RegisterMaterial_Injected  (native crash)
← EntitiesGraphicsSystem.RegisterMaterial  (EntitiesGraphicsSystem.cs:2674)
← RegisterMaterialsAndMeshesSystem.RegisterMaterialsAndMeshes (…:534 → :376)

:534 는 renderArray.MaterialReferences[i] 를 등록하는 줄이다. 머티리얼이 없으면(null) 경고만 찍고 넘어가는데 충돌했다 → 이미 파괴된(Destroy) 머티리얼을 들고 있는 RenderMeshArray 가 새로 등록될 때로 추정.

해 본 것(둘 다 효과 없음)

가설 조치 결과
HDRP 머티리얼(EffectAssets/PowerUps/Materials/HDRP/PowerUpMat.mat, 셰이더 없음) URP판 셰이더·속성으로 교체(백업: 세션 스크래치패드) 여전히 충돌 → 원인 아님. 되돌릴지 PD 결정 대기(미커밋)
TVMonsterProxies 가 등록한 런타임 머티리얼을 등록 해제 없이 Destroy OnDisable 에서 UnregisterMaterial/UnregisterMesh 후 파괴 여전히 충돌(미커밋 · 유지해도 무해한 올바른 수정)

2026-09-24 세션 2 결과(실측)

  • 충돌 3회(로컬 08:43 · 08:49 · 09:01 — 크래시 폴더명은 UTC)는 전부 같은 네이티브 스택: BatchRendererGroup::RegisterMaterial → Material::AcquireSharedMaterialData → BuildProperties → UpdateHashes → ShaderLab::Pass::ComputePassValuesHash → GpuProgramParameters::PrepareOverridingValues. "재질이 null/파괴됨"이 아니라 재질 속성·셰이더 패스 값을 만드는 중의 충돌이다.
  • 09:09 에디터 재시작 이후 진입 4회 모두 정상(PD 09:13 · PM 09:42 · 09:49 · 09:52). 그중 09:52 는 TVMonsterProxies 등록 해제를 일부러 끄고 프록시 35개를 둔 채 진입 → 정상. → 위 표의 두 가설(HDRP PowerUpMat · 프록시 재질 미해제)은 원인이 아니다. PowerUpMat 은 원본으로 되돌렸고, 등록 해제 코드는 올바른 수정이라 유지했다.
  • 원인은 미확정. 세 충돌은 모두 같은 에디터 세션 묶음(08:30 코드 수정 뒤 첫 일일 도전 진입들)에서만 났고 재시작 뒤 사라졌다 — 에디터 세션 상태(셰이더/재질 캐시 등)가 의심되나 증거 없음(셰이더 캐시 기록·컴파일러 실행 로그로는 판별 불가).
  • 재발 시 절차: Play 시작 직후 unity command eval --code "BurningTimes.Visual.TVMaterialProbe.Install(); return 1;" → 일일 도전 진입 → 충돌하면 Logs/TV_MaterialProbe.log 의 마지막 "등록 시도" 줄(OK 없이 끝난 줄)이 범인 재질. 프로브는 게임보다 먼저(LateUpdate) 새 RenderMeshArray 재질을 같은 API 로 등록해 본다(DontDestroyOnLoad 진단 오브젝트로 씬 전환 뒤에도 동작).
  • 크래시 덤프 %LOCALAPPDATA%\Temp\Unity\Editor\Crashes\Crash_2026-09-2* 3개 보존(cdb/WinDbg 없음).

4. 커밋 af5813a128(bt/work · push 완료) 내용

파일 내용
TVContentsPanel.cs 컨텐츠 창을 오른쪽에 · 테르티스의 가호 카드 → 일일 도전 시작(투명 덮개, 원본 연결 무수정) · 인벤토리/성장과 겹치지 않게
TVSidePageHost.cs 자리 만들기에 right 옵션
TVGrowthPanel.cs · TVInventoryPanel.cs 열릴 때 컨텐츠 닫기
TVMonsterProxies.cs 프록시 재질·메시 등록 해제 후 파괴(올바른 수정, 충돌 원인은 아님 §3)
Scripts/Scene/LoadingScene.cs 게임 코드 LoadLobbyScene: StartGameType = None(무한 로딩 원인 차단 · 날짜 주석)
Scripts/Scene/LobbyScene.cs 게임 코드 Login 스플래시 숨김을 Invoke → 실시간 코루틴 HideLoginCor(날짜 주석)
TVTutorialSuppressor.cs + LobbyPlayScene.prefab(BT_Visual 에 부착) BT 로비에서 원래 튜토리얼 팝업 둘(Lobby/Canvas · GameCanvas 사본)을 끈다. 인스펙터 토글 2개
TVLoadTimeline.cs · TVMaterialProbe.cs 미부착 진단 도구 — Play 중 Install() 을 eval 로 부르면 Logs/TV_LoadTimeline.log(씬 로드·[Entity] 로그·timeScale 변화·0.2초 넘는 프레임) · Logs/TV_MaterialProbe.log 기록

커밋에서 뺀 것: NanumBarunGothic SDF.asset(TMP 동적 아틀라스 Play 잔여 · git restore) · PowerUpMat.mat(원복 — 게임 자산 변경은 PD 결정 사항).

무한 로딩(테르티스의 가호 → 복귀) 원인·수정

  • 실측(PD 화면): 로비 로드 뒤 Time.timeScale=0 · AudioListener.pause=true(효과음 꺼짐 설정, 무관) · Login 활성 · IsInvoking("HideLogin")=true. Invoke 는 배율 시간이라 영영 실행되지 않아 'Dead Archive' 스플래시가 남는다.
  • 0 의 출처: 로비 방치 플레이 GameCanvas 사본의 게임 튜토리얼(m_LobbyTutorial=false) 5·6장 "일일도전"(openGameType=DailyChallenge · pauseGame) — LoadingScene.StartGameType 이 DailyChallenge 로 남아 로비에서 열렸다. PopupBase 목록에는 안 잡힌다(TutorialPopUp 은 PopupBase 가 아님). 기획팀 세션도 같은 관찰.
  • 수정: ① 로비 복귀 시 StartGameType 초기화 ② 스플래시 숨김 실시간화 ③ TVTutorialSuppressor. 검증은 §0 · 대화로그 2026-09-24.md 참고.

5. 이번 세션에 만든 것(커밋 be0218b636)

  • 왼쪽 창 공통: TVSidePageHost(로비 페이지를 게임 화면 캔버스 좌/우로 옮기고 정확히 되돌림) · TVLeftPanels.CloseOthers(장비·성장·특성 하나만)
  • 인벤토리 TVInventoryPanel: 실제 아이템·탭·정렬·툴팁(누른 칸 위 · 아무 곳 터치/3초 닫힘 · 정렬 260 오버라이드)
  • 장비 TVEquipmentPanel+TVEquipmentLayout+TVMountSlots(8칸: 좌 무기·보조무기·갑옷·장갑 / 우 신발·모자·목걸이·반지) · 7열 목록 · 상단 레벨/프리셋/스탯(999 더미)/닫기 · ATK/HP 실값
  • 플레이어 정보 TVCharacterInfoPanel+TVCharacterInfoLayout: 초상화 → 참고 레이아웃(스탯판·Lv/Exp 바(ComfyUI 틀)·프로필 확대·그러데이션·공격력/생명력) · TVCharacterRenderSync(캐릭터 렌더 공유)
  • 성장 TVGrowthPanel(정보 보류/스킬/강화 탭) · 강화 = 기존 FR 진화 창 · 스킬 = TVSkillTreeLayout(TBH 방식: 단 해금 0·10…70, 패시브 원·액티브 육각, 레벨업·포인트 반환·장착 슬롯(2/4 열림)·초기화, 무기 8칸 아이콘은 ComfyUI)
  • 특성 TVTraitPanel+TVTraitLayout(디자인만 · 별빛 배경 ComfyUI) · 길드 토스트 · 창 타이틀바 TVWindowTitleBar(X 숨김 · 투명 끌기 영역)
  • 그림: Assets/BurningTimes/Visual/Textures/UI(바 틀·닫기·원·육각·화살·확대) · Textures/Icons(무기 6 · 스킬 10)

6. 남은 과제

  1. 로딩 최적화 검토(PD 요청 · 실측 근거는 대화로그 2026-09-24.md): ① 스크립트 변경마다 서브씬 재굽기(로비 +5초 · 일일 도전 +3~5초, 에디터 전용) — BT 스크립트를 베이커가 없는 별도 asmdef 로 분리하면 BT 수정으로는 재굽기가 안 난다 ② 로비 씬 로드 2초 + 로비 초기화 2.6초/1.2초 정지 구간 프로파일러로 세분화 ③ 스플래시 고정 1초 대기(HideLoginCor(1f))는 필요 시 0.3초 정도로 ④ 전투 중 RenderMeshArray 버전 교체로 재질 재등록 폭주(10초에 211회) — 풀 엔티티가 파괴·재생성되는 경로 확인 ⑤ 로비 '오디오 리스너 2개·이벤트 시스템 2개' 경고가 매 프레임 로그(게임 측 중복: LevelEssential/SceneEssential/EventSystem 과 루트 EventSystem · 위젯 카메라 리스너) — Editor.log 가 시간당 100만 줄 넘게 자란다
  2. 플레이어 정보 패널 자동 회귀 제외(Open/Toggle 공개 메서드 없음) — 수동 확인 필요
  3. 성장 "정보" 탭(보류) · 스킬 이름/효과/슬롯 수·포인트 규칙(현재 임시: 포인트 = 영웅 레벨, 실행 중에만 기억)
  4. 플레이어 정보 스탯·경험치, 장비 4스탯·프리셋 — 모두 더미(기획 대기)
  5. 인벤토리 창고·짐꾼·제작·판매·확장 — 게임에 기능 없음(안내만)
  6. HUD 게임 데이터 연결(HP·경험치·레벨·포션) · 위젯 자동 이동/전투(이전 인계서 §5)

7. 다음 세션 첫 프롬프트 (그대로 붙여 넣기)

FirstRising UI 작업을 이어서 진행한다.

먼저 E:\BurningTimes\공유\대화로그\FirstRising\2026-09-24_UI작업_인수인계.md 를 읽어라.
다른 문서는 열지 마라.

작업 규칙
- 스크립트는 BT_Visual 노드에만 컴포넌트로 붙인다
- 게임 원본 프리팹은 수정하지 말고 복사본을 만들어 쓴다
- 자잘한 결함은 묻지 말고 바로 고쳐라
- 작업이 끝나기 전에 턴을 끝내지 마라. 승인이 필요하면 질문으로 끝내라
- 커밋·푸시는 내가 지시할 때만
- 보고는 한국어·간결·경어, 호칭은 PD님

이번 작업: 인수인계서 §6-0 로딩 최적화 — 실측 근거(대화로그 2026-09-24.md)를 바탕으로 PD가 고른 항목부터 진행. 진단은 TVLoadTimeline(Install 을 eval 로 호출)로 측정한다.

Unity CLI 요령(2026-09-24 실측): unity command editor_play|editor_stop|recompile|recompile_status|get_console_logs --severity error|eval_file --file x.cs --json. 여러 줄 C# 은 eval_file 로(인라인 --code 는 공백·따옴표에서 인수가 갈라진다). PowerShell 자동화 스크립트에 한글이 들어가면 UTF-8 BOM 으로 저장해야 PS 5.1 이 파싱한다. 결과 JSON 은 ConvertFrom-Json 뒤 data.result.result.