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

176 lines
13 KiB
Markdown
Raw Permalink Normal View History

# FirstRising 2026-09-23 — 위젯 공격 불가 수정 · 하단 HUD 신설 (BT18)
## PD 지시 (요지)
1. 위젯 모드 공격 불가 버그 수정 + §4 기술 부채 정리 → **A안 승인**
2. 위젯·최대화·기본 창 세 모드에 첨부 형태의 HUD 추가, **ComfyUI 로 디아블로풍 UI 생성**
3. 표현만 우선, 기능 연결은 다음 단계
4. 좌 가고일 / 우 천사 석상 배경 + 상단 레벨·경험치 바, 석상과 바는 **따로 그려 합칠 것**
5. 단축키 표시 제외 · 패시브 아이콘 제외 · HP 와 가방 강조 · 우측 구체 자리는 **가방**
6. 레퍼런스 스크린샷 기준으로 구조를 맞출 것. 질감·입체감 과하지 않게, 형체 특징 위주
7. **목표 도달까지 중단 없이 자율 폴리싱**, 완성 판단 시 푸시
## 결정
- 아트 경로: **SD1.5(difconsistency) + Diablo4 LoRA + GameItemUI LoRA + ControlNet(canny)**, 배경 제거는 **Inspyrenet**
- 구조: 장식 없는 석재 띠 + 좌·우 부조 + 9-slice(좌150·우150·상하50) → 창 크기 무관 동일 구도
- 프레임·아이콘은 Layer Lab 유지, 생성물은 띠·부조·오브 링·경험치 바에만
## 결과
- 커밋 `ba4c782013` → **origin/bt/work 푸시 완료**(미푸시였던 병합 2건 `c452c9aae4`·`20640c4f15` 함께 반영)
- `TVHudBar` 신설(표현 전용·`Update` 없음), `TVSkillBar` 사각 슬롯·가방 재배치
- 결함 7건 동시 수정 — 위젯 공격 불가 / 데미지 숫자 위치 / TV 3종 NRE / ComposePopup NRE / 싱글턴 중복 / 공용 머티리얼 오염 / TVSpawnFilter 제거
- 컴파일 `failed:false errors:[]`, 실기동 캡처로 배치 확인
## 남은 이슈
- **기능 연결 미착수** — HP·경험치·레벨·포션 수량은 고정 표현값. 다음 단계
- **위젯 자동 이동·자동 전투** 신규 안건(PD 분류) — 미착수
- §4 기술 부채 2·3단계(`Find`/`GetComponentsInChildren` 캐싱, 역할 분리) 미착수
- 미커밋 잔여: `CLAUDE.md`·`Docs/*`·`README_위젯모드.md`(문서 3층 정비), `TVLobbySetup.cs`·`Lobby.unity`(이전 세션분), `ProjectSettings`·`Packages`(유니티 자동)
- ComfyUI `RMBG-2.0` 모델 로딩 실패(BiRefNet 원격 코드 이슈) — Inspyrenet 으로 우회 중
---
# BT18 · HUD 2차 — Blender 절차 생성으로 아트 교체 + 위젯 영역 기준 배치
## PD 지시(원문 요지)
- "i2i / 블렌더 3D / ComfyUI 어떤 방법이든 좋으니 목표 퀄리티에 도달할 때까지 R&D 지속"
- "블렌더 설치했으니 이걸로 UI 형태를 만들어 활용하는 방법도 고려해봐"
- "깃털은 단순히 UI 디자인적인 부분이라 없어도 상관 없어. **컨셉에 맞는 퀄리티가 가장 중요**"
- "스킬 아이콘과 나머지 아이콘 배치가 누락된 것 같아"
- "스킬 아이콘도·하단 주요 메뉴도 **위젯 화면 UI 영역 내**에 배치. 전체 화면 기준이 아니라 **항상 위젯 화면 영역이 기준**"
## 결정
- 아트 생성 경로를 **ComfyUI → Blender 절차 모델링**으로 전환. 크기·알파·색을 수치로 통제할 수 있어 반복이 빠르다
(`bl_hud.py` 한 파일에 모드별 빌더: `demon`/`angel`/`expbar`/`level`/`slot`/`round`)
- 좌 가고일 = 박쥐 막날개, 우 천사 = 깃 부채꼴 — 같은 소켓에 날개만 바꿔 좌우를 구분
- 구슬 안쪽은 **바닥·액체·광택 3겹**(PIL 생성). 평면 원 한 장으로는 유리구슬로 안 읽힘
- 기준 사각형 = `CenterHolder`(위젯 영역). `TVViewportScaler`/`TVViewportHost` 신설로 HUD·스킬바·하단메뉴가 모두 그 안에서 1080 기준 좌표를 쓴다
## 결과(실측 확인)
- 신규 리소스 9종: `BT_HudOrbLeft/Right`, `BT_HudOrbCavity/Liquid/Gloss`, `BT_HudExpFrame`, `BT_HudLevelPlate`, `BT_HudSlotFrame`, `BT_HudRoundFrame`
- 신규 스크립트 `TVViewportScaler.cs`(+`TVViewportHost`) — `UIBehaviour.OnRectTransformDimensionsChange` 기반, `Update` 없음
- `ViewportLayoutController`에 `holderParent` 공개 프로퍼티 추가(원본 코드 · 날짜 주석)
- 버그 3건 수리
1. 배율 컴포넌트가 대상 주입 전 `OnEnable`을 지나 배율 1.0 고정 → `Bind()` 추가
2. 소켓 그림에 불투명 바닥이 있어 HP 액체를 덮음 → 가운데를 비운 링으로 재렌더
3. 같은 부모 안에서 형제 순서가 그리는 순서라 소켓이 가방 아이콘을 덮음 → `sortOrder` 정렬 추가
- `Lobby.unity`의 프리팹 오버라이드가 프리팹 값을 덮고 있던 것 확인 → 프리팹·씬 양쪽에 동일 수치 반영
- 컴파일 `failed:false errors:[]`, 실기동 캡처로 확인
## 남은 이슈
- 기능 연결(HP·경험치·레벨·포션 수량) 미착수 — 다음 단계
- 게임 뷰 렌더 해상도를 평가용으로 바꿨다가 1280×720 으로 원복함
- 커밋하지 않음(PD 지시 전까지) — 작업 트리에 둠
## BT18 · HUD 3차 — 위젯 표시 규칙 반전 · 간격 · 아이콘 · 카메라 포커스
### PD 지시
1. 최하단 UI(주요 메뉴)는 **최소화 모드(배경 투명)에서 숨김**, 이번에 추가한 HUD 는 **보임** (기존 구현과 반대)
2. 최하단 UI 와 HP·스킬 아이콘 영역 간격이 너무 멀다
3. 성장 메뉴가 보이는 상태에서 **플레이어 포커싱이 중앙**이 되도록
4. 아이콘 크기가 프레임과 너무 차이나지 않게
### 결과(실측)
1. `TVBottomMenu` 가 위젯 이벤트를 구독해 숨고, `TVHudBar`·`TVSkillBar` 는 위젯 상태를 보지 않는다
→ 실측 `isWidget=True` 에서 `TV_HudBar=보임 TV_SkillBar=보임 TV_BottomMenu=숨김`
2. 띠 중심 380 → **300**, 메뉴 높이 230 → **175** (구슬 아래 180 · 메뉴 위 175 = 간격 5)
3. 신규 `TVCameraFocus.cs` — 뷰포트가 줄면 카메라 `offset` 을 고쳐 플레이어를 "HUD 에 안 가리는 영역"의 한가운데로 보낸다
→ 실측 성장 페이지 열림 h=658 에서 `vpY=0.738 = 목표 0.738`, offset 0.00 → -4.12, 닫으면 **0.00 으로 복귀**
→ 크기 변경 뒤 1.2초만 수렴 계산(평소 프레임 비용 없음)
4. `iconFillRatio` 신설 0.80, 스킬 `iconScale` 0.80 / 가방 0.82, 확대 버튼에도 같은 테두리 추가
### 주의
- `Lobby.unity` 의 **프리팹 오버라이드가 프리팹 값을 덮는다** — 수치 변경은 프리팹·씬 양쪽에 함께 넣어야 한다
## BT18 · HUD 4차 — 하단 여백 · 정중앙 포커싱
### PD 지시
1. 스킬 UI 아래 버튼 때문에 하단 메뉴와 여백이 넓다 → 레퍼런스처럼 버튼 위치 정리
2. 상단에 UI 가 있는 메뉴에서 캐릭터가 **정확히 게임 화면 중앙**에 오도록
### 결과(실측)
1. 스킬 칸 아래 줄을 없앴다 — 포탈·자동을 상단 한 줄로 올림
상단 줄(y=438): 포탈(-452) · 포션(-370) · 레벨(-268) · 경험치 바(40, 400×50) · 자동(295) · 회피(374) · 확대(452)
띠 중심 300 → **288**, 메뉴 높이 175 → **160** → 구슬 아래끝 168 · 메뉴 위끝 160 = 여백 8
- 발견·수리: 자동 버튼이 6번 스킬 칸과 겹쳐 있었다(실측 Skill6 150~220 · Auto 185~219)
2. `TVCameraFocus.hudCoverBottom` 기본값 0 → 목표가 화면 정중앙이 된다
→ 실측 성장 페이지 열림 h=658 에서 **vpY = 0.500**, 닫으면 원래 offset 으로 복귀
## BT18 · HUD 5차 — 레퍼런스 배치로 묶기
### PD 지시
- 레벨·경험치 바를 스킬 UI 바로 위에 얹을 것
- 자동은 생명 구슬 우측 하단 여백, 회피는 가방 좌측 하단 여백
- 나머지 버튼도 생명·가방 구슬에서 멀어지지 않게
### 결과
- 경험치 바 (30, 348) 330×46 · 레벨 (-196, 348) 72 → 스킬 칸 위끝 323 바로 위(간격 2)
- 자동 (-250, 224) · 회피 (250, 224) — 구슬 아래쪽 여백 줄, 크기 맞춤(자동 53 · 회피 56)
- 포션 (-380, 424) 생명 구슬 바로 위 · 포탈 (380, 424) 가방 바로 위 · 확대 (474, 424)
- 6차: 포션 (-268, 350) 생명 구슬 우측 상단↔스킬 사이 · 포탈 (268, 350) 가방 좌측 상단↔스킬 사이 · 확대 (472, 404) 가방 우측 상단
레벨 (-170, 348) 66 · 경험치 바 (45, 348) 300×46 으로 좁혀 자리 확보
## BT18 · HUD 7차 + 자동 공격 억제 복원
### PD 지시
- 확대 버튼을 같은 높이로 내리고 조금 키울 것
- HP·스킬 UI 와 하단 메뉴 여백을 더 좁힐 것
- 위젯 모드에서 사거리 밖인데도 공격 동작을 반복한다 → 원형 체크 영역에 들어오기 전에는 자동 공격 금지
### 결과(실측)
- 띠 중심 288 → **256**, 메뉴 높이 160 → **140** → 구슬 아래끝 136 (메뉴 그라데이션 위끝 140 과 맞물림)
상단 줄 y=316 · 자동/회피 y=192 · 확대 (472, 316) 크기 52 → **62**
- `TVPlayerAttackRange`
- `holdFireWithoutTarget` 기본값 false → **true** (프리팹·씬 모두 반영)
- `HoldFire` 에서 위젯 모드 제외 조건 삭제 — 지금은 `UpdateSuppress` 가 매 프레임 `EnemyInRange` 로 덮어쓰고,
빠져나가는 모든 경로에서 풀어 주므로 위젯 모드에 걸어도 억제가 남지 않는다
- 위젯 전환 시 한 번 풀고 다음 Update 가 사거리에 맞춰 다시 건다
- 실측: 일반·위젯 모두 `Range=6.30 EnemyInRange=False suppress=True`
현재 씬 몬스터 36마리 전원 생존, **최근접 32.87** — 사거리 6.30 밖이라 공격이 멈추는 것이 정상 동작
## 푸시 (PD 지시)
- `d65f2317d3` → **origin/bt/work 푸시 완료** (이전 `ba4c782013` 위)
- 담은 것: TV 스크립트 6종(신규 TVViewportScaler·TVCameraFocus 포함) · Blender/PIL 아트 9종 ·
`LobbyPlayScene.prefab` · `Lobby.unity` · `ViewportLayoutController` 1줄
- **일부러 뺀 것**(HUD 와 무관한 환경 변경 — 정섭 님 환경을 건드리지 않으려고):
`Packages/manifest.json`·`packages-lock.json`(postprocessing·shadergraph 추가) ·
`ProjectSettings.asset`(define 순서) · `settingsTemplate.gradle`(로컬 repo 경로) ·
폰트 SDF 2종 · `CLAUDE.md` · `TVLobbySetup.cs` · `Docs/`·`output/`·`_Recovery/`
- 정리: 캡처용 `_shot.png` 삭제, 더 이상 쓰지 않는 `BT_HudOrbFill.png` 변경 되돌림
- 정리 커밋 `dbe0261d0b` 추가 푸시 — **작업 트리 완전 비움**(git status 깨끗)
- 되돌림: Packages(postprocessing) · ProjectSettings define · gradle 로컬 repo 경로 · 폰트 SDF 2종
· PPv2 는 코드 의존 없음 확인(문자열 비교 + `#if` 가드) → 되돌린 뒤 Resolve + 재컴파일 `errors:[]`
· 폰트 SDF = TMP 다이내믹 폰트가 Play 때마다 굽는 산출물(이전 세션 잔여가 아니었음 — 보고 정정)
- `.gitignore` 추가: `/output` · `/Assets/_Recovery`(+meta) · `/Assets/GeneratedLocalRepo.meta`
- 담음: `TVLobbySetup`(경로 통짜 → "묶음 아래 이름" 방식) · `Docs/` · `README_위젯모드.md` · `CLAUDE.md`
## 콘솔 NRE 8건 — 원인·수리 (PD 질의)
- 증상: `EntityQuery.CalculateEntityCount` 에서 NRE, 호출부 `TVRegisterRequestGuard.Merge:37`
- 원인: 질의를 `bool m_Ready` 로 한 번만 만들고 다시 만들지 않는다.
World 가 새로 만들어지면(플레이 재진입·씬 전환) 예전 질의는 껍데기라 내부에서 터진다. 해제도 없었다
- 수리: '한 번 만들었는지' → **'어느 World 의 질의인지'** 를 기억하고 바뀔 때만 다시 만든다
같은 형태 6종 일괄 — `TVRegisterRequestGuard`(+OnDestroy 해제) · `TVBossLights` · `TVTestCheats`
· `TVMonsterLocomotion` · `TVMonsterProxies` · `TVEntityBlobShadows`
(이번 세션 앞부분에 고친 `TVShadowCasterSanitizer`·`TVBossScale`·`TVXRayGate`·`TVPlayerAttackRange` 와 같은 방식)
- 확인: 콘솔 비우고 Play→Stop 한 바퀴 — **error 0건**(warn 42·log 58), 컴파일 `errors:[]`
- 커밋 `156b5dee1c` → origin/bt/work 푸시 완료
## master 반영 (PD 지시)
- `git push origin bt/work:master` — 작업 트리 전환 없이 원격만 fast-forward(유니티 재임포트 방지)
- `9009ebb5cc`(2026-09-19) → **`156b5dee1c`**, 35커밋 반영
- 확인: origin/master == origin/bt/work (차이 0) · TV 스크립트 4종 `.cs`+`.cs.meta` 모두 존재 ·
`LobbyPlayScene.prefab` 의 TVHudBar·TVCameraFocus 참조 정상
## BT18 · 인벤토리 패널 + 세션 공유
- PD 지시 "가방 버튼 → 우측 빈 영역에 인벤토리" · "기존 게임 UI 프리팹을 복사해서 사본으로"
- 원본 `Assets/UI/ItemBagPopUp.prefab` 무수정 · 사본 `Assets/BurningTimes/Visual/Prefabs/TV_ItemBagPopUp.prefab` 만 편집
- 신규 `TVInventoryPanel`(BT_Visual 부착) — 위젯 영역 오른쪽에 사본을 띄우고 배율만 맞춤
- 구성: 탭 3(가방/창고/짐꾼) · 정렬 · 134/150 · 제작(청)·판매(황동) · 칸 7×10=70 · 마지막 칸 확장(+)
- 고친 결함: 칸 배율 기준(발광140→슬롯100) · 빈칸 투명 · 델타 이동으로 인한 어긋남 → 앵커 고정 · panelWidth 덮어쓰기
- **커밋 `50a206aadc` → origin/bt/work · origin/master 동시 푸시** (미커밋 0건)
- **인수인계서: `공유/대화로그/FirstRising/2026-09-23_UI작업_인수인계.md`** (다음 세션 첫 프롬프트 포함)
### 새 작업 규칙(메모리 등재)
- 스크립트는 BT_Visual 노드에만 붙인다
- 자잘한 결함은 묻지 말고 바로 고친다
- 작업이 끝나기 전에 턴을 끝내지 않는다 · 승인이 필요하면 질문으로 끝낸다