# 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 노드에만 붙인다 - 자잘한 결함은 묻지 말고 바로 고친다 - 작업이 끝나기 전에 턴을 끝내지 않는다 · 승인이 필요하면 질문으로 끝낸다