최종 갱신 (KST)

← 일감 목록
T-031

클라 — 가챠 화면 · 뽑기 결과 연출

태웅 New 우선순위 보통 목표 미정 · 🎨 아트만 남음

🎨 메인 시스템과 실측이 다 끝났다 (2026-09-05). 남은 두 항목은 전부 연출·리소스다. 막힌 게 아니라 미룬 것이라 art/ 폴더에 있다. 상태가 진행중이 아니라 대기인 것은 지금 아무도 손대고 있지 않다는 뜻이다.

배경

"좋은 아이템이 나왔다"를 플레이어가 확인할 수 있어야 뽑기가 재미가 된다. 서버가 결과를 내려줘도 화면이 없으면 인벤토리 숫자만 조용히 늘 뿐이다.

S_GachaDrawResponse는 이미 연출용 델타(Rewards)와 인벤 반영용 누적(ItemChangeInfos)을 분리해서 내려준다 — 뽑힌 순서 그대로 하나씩 열어 보이는 연출이 가능하다. 희귀도(EGlobalRarity)도 함께 실려 있고, 등급 색상은 Enum.xlsx에 정의돼 있다.

할 일

◐ = 일부만 됐다 · ⏸ = 기획·서버가 먼저 와야 한다(클라가 지금 못 한다) 🎨 = 연출·리소스. 의도적 후순위다 — 메인 시스템이 선 뒤에 한다

✅ ⏸ 넷이 전부 풀렸다 (2026-09-02). 서버가 T-026·T-027을 내렸다 (이슈 #23). main 병합도 끝났다(cf0a28a) — 예전에 적어 둔 "아직 병합되지 않았다"는 낡은 경고라 지웠다.

✅ 메인 시스템 넷의 코드·씬 배선과 실측이 다 끝났다 (2026-09-05). 남은 것은 🎨 둘뿐이다.

  • [x] 가챠 화면 — 단차/10연차 버튼 (GachaPresenter)
  • [x] 가챠 화면 · 풀 목록 · 비용 표시 — 풀 2종 × (1회·10연차) = 버튼 4개를 인스펙터 줄로 받는다. GachaInfoTable의 Name·CostSingle·CostMulti를 Start에서 읽어 채운다. ⚠️ 비용을 상수로 박지 않았다 — 10연차가 단차 × 10이라는 보장이 없다(컬럼이 따로다)
  • [x] 보유 골드 표시 · 부족하면 버튼 비활성 — CurrencyChanged를 구독해 모자란 줄만 잠근다. 대기 잠금과 함께 보므로 대기가 풀려도 못 사는 버튼은 잠긴 채로 남는다 (클라 판단은 표시용일 뿐, 거절은 서버가 한다)
  • [x] 결과 창 — 뽑힌 목록을 5열 × n행으로 한 번에 표시(수량 표시는 끔), 희귀도 색상 적용 (UI/System/GachaResultPresenter/, 칸은 SlotView 프리팹 재사용)
  • [ ] 🎨 결과 연출 — 한 번에 띄우는 지금 방식 대신 뽑힌 순서대로 하나씩 공개 → 길은 이미 열려 있다(S_GachaDrawResponse.Rewards가 뽑힌 순서의 델타다). 못 해서가 아니라 뒤로 미룬 것이다 — 보상 종류 축(T-026)이 들어오면 연출이 다뤄야 할 대상이 바뀐다. 한 화면에서 아이템·캐릭터를 함께 처리하는 모양이 정해진 뒤에 만든다
  • [ ] 🎨 희귀도 스프라이트 — 지금은 RarityPalette가 색만 돌려준다 (코드에 TODO. 표 한 줄과 SlotView.Bind 한 줄을 sprite 대입으로 갈아끼우면 끝난다). 색으로 이미 구분되므로 기능은 서 있다. 리소스가 준비되는 시점에 붙인다
  • [x] 캐릭터 결과와 아이템 결과를 한 화면에서 처리한다 → GachaResultPresenter.ToSlotData가 GachaRewardInfo.RewardType으로 갈라 ItemId / CharacterTid를 읽는다. 이름도 GetItemName / GetCharacterName으로 갈린다. ⚠️ 분기 전에는 ItemId를 무조건 읽어 캐릭터 보상이 빈 칸으로 그려졌다 — 필드가 추가만 된 형태라 컴파일도 경고도 통과했다. 자원 풀만 뽑던 동안엔 드러나지 않던 잠복 결함이다. ※ 아이템 전용이던 SlotView.Bind(int, int, GlobalRarity) 래퍼는 성립하지 않게 되어 걷어냈다
  • [x] 뽑은 뒤 캐릭터 목록·인벤토리·골드 표시가 재로그인 없이 갱신되는지 실측 (2026-09-05 확인) → 인벤토리는 확인됐다 (2026-08-26, 10연차 실행 검증). 캐릭터는 지급 직후 서버가 S_CharacterListResponse를 다시 민다 — 뽑기 응답에는 개체 PK가 없다(DB가 늦게 발급한다). 골드는 S_CurrencyResponse로 온다
  • [x] 실패 응답 처리 — 연출을 재생하지 않고 사유를 보여준다 → GachaPresenter.OnGachaFailed가 ResultMessages.ToText로 문구를 만들어 대기를 Fail로 닫고, GachaResultPresenter는 GachaCompleted만 구독하므로 팝업이 안 뜬다. NotEnoughCurrency = 102("골드가 부족합니다.")를 표에 넣었다 — 전에는 "알 수 없는 오류가 발생했습니다. (코드 102)" 로 떴다. 골드 부족은 정상적인 실패 경로다
  • [x] 씬 배선 — 버튼 4개를 Gacha Presenter의 Draws에 화면 순서대로 넣었다 (2026-09-04). [0]=풀1x1 · [1]=풀1x10 · [2]=풀2x1 · [3]=풀2x10 (풀 1=구슬 상자 · 2=캐릭터 소환)
  • [x] 풀 1(구슬 상자) 버튼 2줄 제거 (2026-09-20 · 81bd727) — 골드로 판매 전용 아이템을 뽑는 구조라 sink가 아니다. 자원은 채취로 얻으므로 골드는 캐릭터·장비 뽑기에 쓴다. 예정대로 T-067의 장비 3풀 배선과 한 작업에서 했다 — Draws가 4줄 → 8줄이 됐다. ✅ 서버 테이블은 테스트용으로 남긴다고 답이 왔다 (2026-09-22 · 이슈 #30 종료) — GachaServiceTest가 GachaInfoTable 1번의 비용 메타를 읽어서 지우면 테스트가 깨진다. 서버 변경 없음

완료 조건

화면에서 골드로 10연차를 뽑아 결과가 순서대로 열리고, 뽑은 캐릭터가 배치 화면 목록에 바로 나타난다.

막고 있는 것 / 선행 일감

  • ✅ 없다. T-026·T-027이 끝나 패킷 모양과 결과 코드가 확정됐고 (이슈 #23), main 병합도 끝났다(cf0a28a)
  • ⚠️ 연출(🎨)은 막힌 게 아니라 미룬 것이다. 기술적 선행은 없지만, T-026이 보상에 캐릭터를 얹으면 연출이 다뤄야 할 대상이 늘어난다. 먼저 만들면 두 번 만들게 되므로 T-026 뒤로 둔다 — 이 판단은 서버·기획과 공유돼 있다

관련 커밋

  • 53f71d3 — 가챠 결과 팝업 추가 (결과 창·등급 색·칸 프리팹 재사용)
  • c69e198 — 가챠 결과 팝업 크기·글꼴 다듬기
  • 7fc65ea · 81bd727 — 장비 3풀 배선 · 구슬 풀 제거 (T-067과 한 작업)

참고

  • Assets/Scripts_Client/폴더 구조.md — 폴더마다 <폴더명> 규칙.md가 있다
  • 희귀도 색상: GameDesign/Excel/Enum.xlsx (GlobalRarity) — 캐릭터도 같은 축을 쓴다
  • 가챠 풀·비용: GameDesign/Excel/Gacha.xlsx (GachaInfoTable · GachaItemTable · GachaCharacterTable · GachaEquipTable)
  • 이슈 #30 — 구슬 풀을 화면에서 빼고 서버에는 남길지. 2026-09-22 종료 — 화면에서 빼고 서버 테스트용으로 남긴다
  • 캐릭터 30종·등급: 캐릭터 1.2 · 5.1