117 lines
12 KiB
Markdown
117 lines
12 KiB
Markdown
|
|
# 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. 남은 과제
|
||
|
|
|
||
|
|
0. **로딩 최적화 검토(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만 줄 넘게 자란다
|
||
|
|
1. 플레이어 정보 패널 자동 회귀 제외(Open/Toggle 공개 메서드 없음) — 수동 확인 필요
|
||
|
|
2. 성장 "정보" 탭(보류) · 스킬 이름/효과/슬롯 수·포인트 규칙(현재 임시: 포인트 = 영웅 레벨, 실행 중에만 기억)
|
||
|
|
3. 플레이어 정보 스탯·경험치, 장비 4스탯·프리셋 — 모두 더미(기획 대기)
|
||
|
|
4. 인벤토리 창고·짐꾼·제작·판매·확장 — 게임에 기능 없음(안내만)
|
||
|
|
5. 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`.
|