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 지시)
- 스크립트(MonoBehaviour)는
Lobby/LobbyPlayScene/BT_Visual노드에만 붙인다. 프리팹 설정값은Assets/GameAssets/LobbyPlayScene.prefab을 SerializedObject 로 바꾼다(--detach로 실행, 결과는 파일로) - 게임 원본 프리팹 수정 금지(복사본 사용). 게임 코드 수정은 허용하되 날짜·이유 한글 주석 필수
- 자잘한 결함은 묻지 말고 고친다. 승인이 필요하면 질문으로 끝낸다. 끝나기 전에 턴을 끝내지 않는다
- 커밋·푸시는 PD 지시 시만(
bt/work만. master 는 별도 지시) - Play 규칙: 재컴파일 전
EditorApplication.isPlaying을 단독으로 확인한다.editor_play가 "Already in play mode" 를 돌려주면 PD Play 다 — 절대 조작하지 않는다. 내가 띄운 Play 는 검증 후 바로 끈다 - 보고는 한국어·간결·경어, 호칭 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. 남은 과제
- 로딩 최적화 검토(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만 줄 넘게 자란다 - 플레이어 정보 패널 자동 회귀 제외(Open/Toggle 공개 메서드 없음) — 수동 확인 필요
- 성장 "정보" 탭(보류) · 스킬 이름/효과/슬롯 수·포인트 규칙(현재 임시: 포인트 = 영웅 레벨, 실행 중에만 기억)
- 플레이어 정보 스탯·경험치, 장비 4스탯·프리셋 — 모두 더미(기획 대기)
- 인벤토리 창고·짐꾼·제작·판매·확장 — 게임에 기능 없음(안내만)
- 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.