BurningTimesAi/공유/대화로그/FirstRising/2026-09-30.md

111 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FirstRising 대화로그 — 2026-09-30 (개발팀 세션 · BT43~)
## BT43-FirstRising · 장착 무기에 따른 공격 모션 · 패턴 + 플레이어 정보 화면 반영
### PD 지시(원문 · 00:34)
"현재 에디터에서 플레이해보니 플레이어가 장착한 장비에 따른 모션 및 공격 패턴 변화가 적용되지 않는 것 같아.
* 원래 FR 프로젝트를 살펴보고 장착한 무기에 따른 공격 모션 및 패턴 변화를 구현 또는 복원해줘.
* "장비" 메뉴에서 장착한 아이템이 로비(숲)의 기본 플레이어 정보(스텟이 보여지는 화면)에 반영되지 않고 있어. 장비 메뉴에서 장착하면 플레이어 스텟이 보이는 화면에도 반영될 수 있도록 수정해줘."
### 원인(실측 + 코드)
- 로비 씬에는 캐릭터가 둘이다 — 싸우는 캐릭터(`LevelEssential/Ariel` · `Player.Instance`)와 예전 전시용 캐릭터(`LobbyManager.lobbyPlayer` · 꺼져 있음).
- 게임 원본은 장비를 바꾸면 전시용 캐릭터만 갱신한다(`ItemPageUI` · `CharacterPageUI.ShowCharacterItems`). 싸우는 캐릭터는 `TestMonstersController` 가 Play 시작 때 한 번만 무기를 들린다(장착이 없으면 1029 활).
- BT 활 장식(`TVArcherGear`)이 무기 종류와 무관하게 게임 무기 모델을 숨기고 활 · 화살통을 붙였다 → 검을 들어도 활만 보였다.
- 플레이어 정보 화면은 열 때만 슬롯 · 값을 썼다. 장착 뒤 게임이 다시 그리는 것은 장비 화면뿐이다.
- 무기별 공격 모션 · 패턴 자체는 게임에 살아 있다(무기 → 스킬 → `SkillElement.AnimStateHash` → 애니메이터 상태 `Sword0`… `Bow0`…). 끊긴 것은 '장비 변경 → 싸우는 캐릭터' 연결이다.
### 결정(PM)
- 게임 코드는 고치지 않고 BT_Visual 에 연결 구성 요소를 둔다(`TVEquipmentSync`). 게임의 장비 변경 이벤트(`PlayerManager.OnUserStatusChanged`)를 듣고, 장착 상태의 지문이 달라졌을 때만 일한다(매 프레임 하는 일 없음).
- 무기 교체는 게임 함수 `Character.EquipWeapon` 을 그대로 쓴다(에디터 무기 목록 창의 선례). 무기는 그대로고 능력치만 바뀐 경우는 `ApplyAbility` + 능력치 갱신 요청 + 무기 스킬 기본 피해 다시 쓰기.
- 활 전용 대기 · 달리기 교체(`TVAnimationOverride`)는 프리팹에서 꺼진 상태 그대로 둔다(켜면 다른 무기에서도 활 자세가 나온다).
### 결과
- 새 파일 `Assets/BurningTimes/Visual/Scripts/TVEquipmentSync.cs` + `LobbyPlayScene.prefab` 의 BT_Visual 에 부착. 수정 `TVArcherGear.cs`(활일 때만) · `TVCharacterInfoPanel.cs`(장비 변경 신호에 다시 씀).
- 검증 1차(00:4x): 시작 시 검 1436 → 엔티티 무기 1436 · 검 모델 표시 / 활 1029 장착 → 엔티티 1029 · 기본 피해 27 · 활 · 화살통 부착 / 검 재장착 → 기본 피해 34 · 최종 공격력 37 / 정보 화면을 연 채 활 장착 → 무기 슬롯 1436→1029 · 공격력 37→27 / 무기 해제 → 기본 활 1029 · 기본 피해 20.
- 검증 2차(00:57~00:59 · 몬스터 곁에서 공격): 검 → 애니메이터 상태 `Sword0 · Sword1 · Sword2`(스킬 100061~63 · 사거리 4.9 · 4.9 · 6.3) / 활 → `Bow0~Bow3`(스킬 100021~24 · 사거리 6.3) / 정보 화면 공격력 · 생명력 = 캐릭터 계산값(활 27 · 510, 검 37 · 510). 에디터 로그 오류 0(logscan · 6.5 MB).
- 1차에서 찾은 결함 수정: 시작 때 내 동기화와 게임의 첫 장착이 겹쳐 검 모델이 둘 생김 → 게임이 먼저 들 때까지 최대 3초 기다림.
- 한글 주석 점검(comment_scan): 선언 35개 중 누락 0. 저장 파일 3개 시험 전 백업 → 원복(해시 일치).
- 필드를 바꿔 끼운 직후(BT45)에도 새 플레이어 엔티티에 능력치 · 무기 스킬을 다시 넣게 했다(도착 직후 기본 피해 34 · 최종 공격력 37 확인).
- FR `bt/work` `4bca428e62` push(PD 지시 02:0x "충분히 반영되었다고 판단될 경우 … 푸시").
### 남은 이슈
- 가방에 장비가 검 · 활 둘뿐이라 다른 무기 종류(둔기 · 단검 · 지팡이 · 마법 단검)와 방어구 · 룬 경로는 실측하지 못했다(같은 경로라 동작할 것으로 보이나 추정).
- 활이 아닌 무기에서 대기 · 달리기 자세는 무기와 무관하게 같다(게임 원본도 같다).
- 게임 코드 `Character.ApplyAbility` 의 능력치 갱신 요청은 '값'을 종류로 바꿔 넣는 것으로 보인다(손대지 않음 · 정섭 님 확인 필요).
- Editor.log 가 매 프레임 '오디오 리스너 2개 · 이벤트 시스템 2개' 경고로 커진다(게임 측 중복 · 미수정).
## BT44-FirstRising · 최소화(위젯) 모드 — 지형 숨김 + 창 크기 조절 메뉴
### PD 지시(원문 · 01:01)
"* 최소화 모드에서는 플레이어와 몬스터 외에 지형은 보이지 않도록 해줘. (현재 맵 오브젝트가 보이고 있음)
* 최소화 모드에서는 하단 UI 상단 부분에 마우스를 가져다 대면, "창 크기를 조절할 수 있는 슬라이드 메뉴"를 제공해줘. 이 메뉴를 통해 게임 화면의 창의 크기를 조절하고 싶어."
### 원인(실측)
- 최소화 모드 = 게임의 위젯 기능(`DesktopWidgetManager`). 들어가면 메인 카메라에서 `WidgetCulling` 레이어(29)만 뺀다.
- 그 레이어를 쓰는 것은 로비 프리팹(92개)과 숲 맵 서브씬뿐 → 숲에서는 캐릭터 · HUD 만 보인다(정상). 새 테마 맵(필드 이동 6종 · 보스전 전용 필드)은 기본 레이어라 그대로 보였다 — 묘지에서 맵 엔티티 1,565 · 필드 꾸러미 렌더러 427(메시 315 · 입자 102 · VFX 10) · 지형.
- 에디터에서 최소화 모드로 들어가는 길은 게임 화면의 `WidgetModeButton`(에디터는 창을 다루지 않고 상태만 흉내 낸다 — `m_SimulateInEditor`).
### 결정(PM)
- 맵 에셋 · 빌더는 고치지 않는다(레이어를 바꿔 다시 지으면 맵 6종 · 꾸러미 · 전용 필드를 모두 다시 만들어야 한다). 최소화 모드에 들어갈 때 숨기고 나올 때 되돌린다.
- 창 크기 값은 '게임에 설정된 기본 크기'의 배수(0.5~2.5 · 5% 단위)로 둔다. 빌드는 위젯 창의 한 변(`widgetDiameter` 440 × 배수), 에디터는 게임 화면 영역을 같은 배수로 키우고 줄여 미리 보여 준다.
- 막대를 끄는 동안 바로 적용하지 않고 놓는 순간 적용한다 — 창(화면)이 커지면 막대가 마우스 밑에서 움직여 값이 흔들린다.
- 입력은 UGUI 이벤트가 아니라 커서 좌표를 직접 읽는다 — 위젯 창은 포커스가 없을 수 있고, 게임의 위젯 입력도 같은 방식이다.
### 결과
- 새 파일 `TVWidgetScenery.cs`(맵 엔티티에 DisableRendering + 표식 · 지형 그리기 끔 · 등록된 배경 묶음의 렌더러 끔) · `TVWidgetSizeMenu.cs` · `TVRuntimeFont.cs`(실행 중 화면용 글자체). `TVFieldTravel` · `TVBossField` 가 배경 묶음을 등록한다.
- 게임 코드 `DesktopWidgetManager.cs` 2곳(날짜 · 이유 한글 주석): ① 조작 UI 영역 등록(`RegisterWidgetControlArea`) — 그 안에서 시작한 누름은 창 끌기 · 복귀로 보지 않는다 ② 위젯 모드 중 `widgetDiameter` 를 바꿀 때 원형 리전 설정(`m_UseCircularRegion`)을 따르게 함(꺼져 있는데도 원형으로 잘랐다).
- 검증: 묘지 최소화 모드에서 캐릭터 · 몬스터 · HUD 만 보임(엔티티 1,565 · 렌더러 427 · 지형 1 숨김) → 나오면 모두 복구 / 띠에 마우스 → 메뉴 나옴 → 막대 누름(끄는 중 · 위젯 유지) → 50% 자리에서 놓음 → 크기 1.50 · 위젯 440→660 · 게임 화면 471×837→706×1255 px · 저장 / 벗어나면 0.8초 뒤 들어감 / 시험 뒤 크기 · 저장 값 원복. 에디터 로그 오류 0.
### 남은 이슈
- PC 빌드 미검증 — 창 크기 변경(Win32) · 투명 창에서의 모습 · 바탕화면 커서 읽기는 빌드에서만 도는 경로다.
- 크기를 바꾸면 메뉴가 마우스 밑에서 벗어나 잠시 뒤 들어간다(다시 조절하려면 띠에 다시 댄다).
- 최소화 모드에서 스킬 칸 · 가방 버튼을 누르면 게임의 위젯 입력이 '복귀'로 처리한다(기존 동작 · 이번에 바꾸지 않음) — 필요하면 같은 조작 영역 등록으로 풀 수 있다.
## BT45-FirstRising · 맵 이동 로딩 단축 + 로딩 진행도 표시
### PD 지시(원문 · 01:01)
"맵 이동 시 로딩이 너무 긴데 왜 이렇게 오래 걸리는거지? 좀 더 로딩 시간을 줄일 방법이 없을까?
그리고 로딩 중에는 loading... 글자와 함께 로딩 진행도를 프로그레스 바 형태로 제공해줘."
### 원인(실측 · 맵 이동 5회 · 게임 안 시계)
| 구간 | 시간 |
|---|---|
| 화면 가림 | 0.2초 |
| 엔티티 전체 정리(엔티티 씬 16개 내림 · 재질 등록 해제 · 삭제) | 1.85초(한 프레임) |
| 로비 씬 읽기(뒤에서) | 1.6초 |
| 로비 씬이 켜지는 프레임(화면 · 구성 요소 전부 다시 만듦) | 3.25초(한 프레임) |
| 그 뒤 첫 프레임(맵 서브씬 읽기 포함) | 1.0~1.2초 |
| 기다림 + 화면 걷음 | 0.7초 |
| **합계** | **8.3~8.7초** · 몬스터는 도착 6~7초 뒤에 나옴 |
- 그 맵에 처음 갈 때(스크립트를 고친 뒤 첫 방문)는 서브씬 굽기 4~5.5초가 더 붙어 12~15초 — 에디터 전용(빌드는 미리 구워 둔다).
- 즉 '맵만 바꾸면 되는데 로비 씬 전체를 다시 읽는 것'이 대부분이었다(BT39 에서 화면 구성을 유지하려고 택한 방식).
### 결정(PM)
- 로비 씬을 다시 읽지 않고 맵만 바꿔 끼운다. 예전 방식은 남겨 두고, 바꿀 수 없거나 실패하면 그쪽으로 넘어간다.
- 플레이어 엔티티는 맵 서브씬에 구워져 있다(1차 검증에서 발견 — 맵을 내리자 게임 시스템 5곳이 사라진 엔티티를 건드려 예외 15,781회). → 맵을 내리기 전에 관리 쪽 캐릭터의 엔티티 연결을 비우고(`initPlayer` 끔 · `characterEntity` 비움), 새 맵이 읽히면 게임의 플레이어 초기화가 다시 돌게 한다(`WorldManager.initPlayer` 끔 → `PlayerEntitySyncSystem` 이 새 엔티티에 연결 · 시작 자리 · 카메라 · 체력). 게임 코드는 고치지 않았다.
- 몬스터 · 소환수 · 젬 · 드롭은 지우지 않고 풀로 돌려보낸다(게임의 회수 절차와 같은 값). 상자(깨지는 상자)는 건드리지 않는다.
- 맵 읽기는 기다리지 않고 맡긴다(화면이 멈추지 않아 진행 막대가 움직인다).
### 결과
- `TVFieldTravel.cs`(맵만 바꿔 끼우기 · 예전 방식 유지) · 새 파일 `TVLoadingScreen.cs`(검은 막 + "Loading..." + 진행 막대 + 퍼센트 · 게임 화면 영역 한가운데). `TVEquipmentSync` 는 필드가 바뀌면 새 엔티티에 능력치 · 무기 스킬을 다시 넣는다.
- 검증(Play 1회 · 게임 안 시계):
| 이동 | 방식 | 시간 |
|---|---|---|
| 숲 → 묘지(처음 · 굽기 포함) | 맵만 바꿈 | 5.6초 |
| 묘지 → 숲 | 맵만 바꿈 | 1.95초 |
| 숲 → 묘지 | 맵만 바꿈 | 1.4초 |
| 묘지 → 사막(처음 · 굽기 포함) | 맵만 바꿈 | 5.6초 |
| 사막 → 묘지 | 예전 방식(비교용) | 8.65초 · 몬스터는 7초 뒤 |
| 묘지 → 숲 | 맵만 바꿈 | 1.9초 |
- 도착 즉시 몬스터(47~53마리) · 플레이어 시작 자리(맵마다 구워진 자리와 일치) · 체력 510/510 · 무기 1436 기본 피해 34 · 분위기(안개 · 환경광) 일치 · 숲으로 돌아오면 숲의 분위기 복구.
- 맵을 바꾼 뒤 보스전 입장 · 퇴장 정상(숨긴 몬스터 53 → 복구) · 보스전 중 이동은 안내만 띄우고 거절 · 에디터 로그 오류 0.
### 남은 이슈
- 처음 가는 맵의 굽기 시간(4~5.5초)은 에디터에서만 남는다 — 스크립트를 고칠 때마다 맵마다 한 번. 줄이려면 Play 시작 때 뒤에서 미리 굽게 하는 방법이 있다(미구현 · PD 결정).
- PC 빌드에서는 테마 맵 서브씬이 빌드에 들어 있지 않다(`mapsInBuild` 꺼짐) — 빌드 미검증.
- 소환수가 있는 상태의 맵 이동은 미실측(소환수도 풀로 돌려보내게 했다).
## 커밋 · 푸시
- FR `bt/work` `4bca428e62`(BT42~BT45) push — 에디터가 덧붙인 변경(재질 4 · 글자체 3 · 엔티티 의존성 1)은 넣지 않았다.
- 조직 레포(이 문서 · PD 지시 로그)는 커밋하지 않았다(PD 지시 시).