최종 갱신 (KST)

← 일감 목록
T-048

클라 — 창고 칸의 적성 표시를 5칸 스트립으로

태웅 Closed 우선순위 보통 목표 미정 · 보관됨

배경

창고 캐릭터 칸의 적성 요약이 읽히지 않는다. T-046이 칸의 보조 문구를 배치 중/배치 가능 → 적성 요약으로 바꿨는데(배치 여부는 '배' 마크가 말하게 됐으므로), 5종을 다 가진 캐릭터에서 문구가 뭉개진다.

농사1·낚시1·채굴1·벌목1·사냥1     ← 19자

숫자로 보면 애초에 들어갈 자리가 아니다.

자리 값
칸(InventorySlotView) 100 × 100
보조 문구(Sub Text) 폭 100 · 높이 20 · autosize min 1
넣으려는 것 19자 → 한 줄로 펴면 글자가 약 5px

줄바꿈을 켜도 2줄 × 10자라 9px이다. "산업 이름 + 숫자" 5쌍은 이 칸에 텍스트로 들어가지 않는다 — 전 산업 적성 1인 기본 지급 캐릭터(TID 1)가 바로 그 최악의 경우라 흔한 화면이다.

⚠️ 적성을 칸에서 빼는 선택지는 닫혀 있다. T-046이 배치 목록에서 적성 0인 캐릭터를 걸러 내기로 방향을 뒤집었고, 그 결정이 성립하는 근거가 "걸러 낸 캐릭터의 적성을 볼 곳이 창고뿐" 이었다. 칸에서 적성이 사라지면 "낚시를 눌렀더니 내 캐릭터가 없다"의 답이 어디에도 없게 된다.

할 일

A. 하단 밴드를 5칸 고정 스트립으로

  • [x] Sub Text가 쓰던 하단 20px 밴드에 20×20 다섯 칸을 깐다 (Aptitude Strip) — 칸 구분을 위해 18×18 + 틈 2px로 내려앉았다
  • [x] 칸의 위치가 곧 산업이다 — 순서는 EIndustryType의 None 제외 순서 (농사 · 낚시 · 채굴 · 벌목 · 사냥). 배치 화면의 산업 버튼이 Enum.GetValues로 같은 순서를 만들므로(WorkStationSelectPresenter.BuildIndustryList) 두 화면의 순서가 저절로 같다
  • [x] 칸에는 숫자를 넣고 적성 0은 X(회색) 로 채운다 — 자리를 비우거나 지우지 않는다. 비우면 배선 누락과 구분되지 않고(1차 확인에서 실제로 그렇게 보였다), 칸이 사라지면 위치=산업이 무너진다
  • [ ] 🎨 아이콘이 오면 각 칸의 배경 스프라이트만 갈아끼운다 — 자리·개수·순서가 그대로라 (→ 아래 "남은 것") 코드는 안 고친다 (rarityImage를 색 → sprite로 바꾸는 기존 TODO와 같은 축)

B. 같은 자리를 두 표시가 나눠 쓴다

  • [x] 스트립과 Sub Text는 같은 밴드다 — 캐릭터 탭은 스트립, 자원 탭은 수량 문구. 자리가 하나라는 사실은 프리팹의 사실이라 판단을 칸이 쥔다(부르는 쪽이 둘을 각각 켜면 한쪽만 고쳐졌을 때 두 표시가 겹친다)
  • [x] 켜는 판단은 격자가 매번 그릴 때 — SetAssignMark(IsCharacterTab && …) 바로 옆
  • [x] ⚠️ SetSubVisible은 화면이 한 번 정하는 스위치로 남겼다(가챠 결과 팝업은 끈다). 탭마다 바뀌는 것은 스트립 쪽이다 — 둘을 한 스위치로 합치면 팝업의 결정이 매 Redraw에 덮인다

C. 값의 출처

  • [x] 적성은 PlayerDataModel.GetAptitude(개체번호, 산업) 로 읽는다 — CharacterTable을 직접 읽지 않는다(값의 주인은 서버다). 장비가 적성에 얹히면 개체마다 갈라진다
  • [x] StorageSlotData(완성값 struct)는 손대지 않았다. 캐릭터 전용 필드를 공용 struct에 넣으면 자원·가챠 칸까지 따라 두꺼워진다 — '배' 마크가 FindSlotIndexOf로 처리되는 것과 같은 방식으로 격자가 캐릭터 탭에서만 읽어 칸에 넘긴다
  • [x] CharacterSlotSource.BuildAptitudeText(문구를 짓던 자리)를 걷어냈다 — 스트립이 값을 직접 받으므로 죽은 코드가 된다. 관문이 둘이면 다음에 보는 사람이 어느 쪽이 진짜인지 알 수 없다(T-046의 적성 0 잠금을 걷어낸 것과 같은 판단)
  • [x] 200칸 × 5개를 매번 그린다 — 숫자 문자열과 버퍼를 재사용한다. 적성은 0~10이라 캐시가 11개면 끝난다(상주 앱이라 Redraw마다 1000개씩 버리면 GC가 쌓인다)

D. 아이콘이 오기 전의 구분

  • [x] 지금은 위치만으로 산업을 가린다 — 배치 화면과 순서가 같다는 것이 유일한 단서다. 부족하면 밴드를 20 → 26px로 키워 약칭 1자(농·낚·광·목·렵)를 숫자 위에 얹는다 (초상화 하단과 6px 겹친다 — 아이템 칸의 수량 띠와 같은 형태)
  • [x] 🎨 이 판단은 실물을 보고 정했다 — 약칭은 넣지 않는다. 플레이에서 숫자 다섯이 그대로 읽혔고(2026-09-12 확인), 넣어 두면 아이콘이 오는 순간 다시 걷어내게 된다

진행 (2026-09-12) — 코드·프리팹 완료 · 플레이 확인만 남음

바뀐 파일 — InventorySlotView(스트립 참조 · SetAptitudes · 숫자 캐시) · StorageGridPresenter(ReadAptitudes · 켜는 판단 한 줄) · CharacterSlotSource(문구 짓던 자리 삭제) · StorageSlotData(주석) · Assets/Prefabs/InventorySlotView.prefab(Aptitude Strip + 칸 5개). 문서는 Storage 규칙.md를 함께 고쳤다.

결정한 것

갈림길 결정 근거
칸 배치 LayoutGroup을 쓰지 않고 앵커를 0.2씩 나눴다 폭이 바뀌어도 5등분이고, 레이아웃 리빌드가 칸 수만큼 돌지 않는다
칸 배경 검정 55% 반투명 Image 하나 등급색이 칸 전체를 덮으므로 밝은 등급에서 숫자가 묻힌다. 아이콘이 들어올 자리를 겸한다
값 텍스트 흰색 · autosize 8~14 · 폰트는 Sub Text에서 물려받음 칸마다 폰트가 다르면 숫자 폭이 달라진다
프리팹 기본 상태 스트립을 켜 둔다 프리팹을 편집할 때 보여야 한다. 런타임에는 Awake가 끄고 캐릭터 탭에서만 켜진다

에디터 작업 — 끝났다 (Unity MCP · SaveAsPrefabAsset)

  • [x] Aptitude Strip(하단 밴드) + Aptitude 0~4(각 Image + Value (TMP)) 생성
  • [x] aptitudeStrip · aptitudeValueTexts[5] 배선 — 순서가 0~4로 맞는지 확인했다

실측 (에디터)

임시 캔버스에 프리팹을 찍어 {1, 10, 0, 4, 7}을 넘겨 봤다.

  • 칸 20×20 · 실제 글자 크기 14 — autosize 상한에 그대로 붙었다(줄어들지 않았다). 두 자리(10)도 14를 유지한다. 기존 5px에서 약 3배.
  • 적성 0은 빈 칸, null을 넘기면 스트립이 꺼지고 수량 문구가 돌아온다. (⚠️ 이때의 "빈 칸"은 아래 1차 플레이에서 X로 뒤집혔다 — 이 줄은 그 시점의 실측이다.)

1차 플레이 뒤 손본 것 (2026-09-12)

걸린 것 고친 것
적성 0이 빈 칸이라 배선 누락처럼 보였다 X(회색)로 채운다. 숫자는 흰색이라 눈이 먼저 숫자를 읽는다
칸이 나뉜 게 안 보였다 — 숫자 다섯 개가 한 줄처럼 붙어 보인다 각 칸이 1px 물러서 틈 2px로 갈린다(칸 18×18 · 배경 검정 78%). ⚠️ 테두리 스프라이트가 오면 이 틈은 걷어낸다 — 임시다
자원 수량이 숫자만이라 무슨 값인지 안 보였다 N 개로 단위를 붙인다(ResourceSlotSource)

남은 것 — 없다 (플레이 확인 통과 · 2026-09-12)

  • [x] 플레이 확인 — 통과 (2026-09-12). 캐릭터 칸 아래에 숫자 다섯이 뜨고 적성 없는 산업은 X로 보인다. 등급색 위에서도 읽히고 칸 구분도 눈에 든다
  • [ ] 🎨 산업 아이콘 — 에셋이 오면 각 칸의 Image에 스프라이트만 넣는다. 자리·개수·순서가 그대로라 코드를 고치지 않으므로 일감으로 남기지 않았다 (등급 스프라이트가 T-031의 🎨로 있는 것과 같은 성질이다).

완료 조건

✅ 충족됐다 (2026-09-12). 전 산업 적성 1인 캐릭터 칸에서 다섯 값이 모두 읽히고, 적성 0인 산업은 X(회색) 로 채워진다 — 1차 실물 확인에서 "빈 칸은 배선 누락처럼 보인다" 가 드러나 빈 칸 → X로 뒤집은 결정이다. 자원 탭의 수량 문구는 그대로다(스트립과 겹치지 않는다).

막고 있는 것 / 선행 일감

  • 없음. 적성(CharacterInfo.Aptitudes)이 이미 클라에 다 와 있고 서버 요청도 없다.
  • T-047과 무관하다 — 스트립은 이름을 쓰지 않으므로 IndustryLabel.cs를 타지 않는다. 약칭(D)을 넣기로 하면 그때만 엮인다.

관련 커밋

  • 없음

참고

  • Assets/Scripts_Client/UI/Storage/StorageGridPresenter/InventorySlotView.cs — 칸. 스트립이 붙는 곳
  • Assets/Scripts_Client/UI/Storage/StorageGridPresenter/StorageGridPresenter.cs — Redraw의 SetSellMark·SetAssignMark 줄이 켜는 판단의 자리다
  • Assets/Scripts_Client/UI/Storage/StorageGridPresenter/CharacterSlotSource.cs — 문구를 짓던 자리
  • Assets/Prefabs/InventorySlotView.prefab — 밴드 구조(Sub Text 폭 100 · 높이 20)
  • Storage 규칙.md — "탭이 달라도 격자는 하나다"