GitHub 이슈: #25 — 클라 담당(JeongTaeWoong99)에게 할당 (2026-09-13)
배경
T-003에서 서버가 캐릭터 경험치를 실제로 쌓기 시작했다 (2026-09-13).
판정이 정산될 때마다 배치된 캐릭터의 레벨·경험치가 바뀌고, 서버는 바뀐 개체 1건을
S_CharacterSyncResponse(PacketId 21) 로 밀어 준다.
클라는 아직 이 푸시를 받지 않는다. PlayerDataModel._characters는 로그인 때 받은
S_CharacterListResponse 스냅샷 그대로라 서버가 밀어도 화면 레벨은 로그인 시점 값이고,
레벨·경험치를 그리는 UI 자체도 아직 없다 (CharacterInfo.Level·Exp를 읽는 코드가 0곳).
서버가 이미 준 것
| 것 | 위치 |
|---|---|
패킷 S_CharacterSyncResponse { CharacterInfo Character } |
Assets/Scripts_Server/Protocol/MikaPacket.cs (미러 완료) |
Unity 핸들러 · 이벤트 ServerPacketHandler.CharacterSynced |
Assets/Scripts_Server/Network/MikaNetwork.Unity/ServerPacketHandler.cs |
레벨 곡선 테이블 CharacterLevelTable (CharacterLevelTID=레벨 · RequiredExp) |
Assets/StreamingAssets/Data/CharacterLevelTable.bytes · Scripts_Server/GameData/Tables/ |
규칙 (→ 캐릭터 5.2)
Exp는 현재 레벨에서 쌓은 양이다. 레벨업하면 필요치를 뺀 나머지로 줄어든다 — 증감이 아니라 확정값이라 덮어쓴다.RequiredExp(L)= 레벨 L에 도달하는 데 직전 레벨에서 필요한 양. 진행 바의 분모는RequiredExp(Level + 1)이다.- 만렙 = 테이블의 마지막 행(지금 100).
Level + 1행이 없으면 만렙이다. - 한 정산에서 캐릭터 여럿이 바뀌면 패킷도 여럿 온다. 판정이 없거나 만렙이면 오지 않는다.
- ⚠️ 레벨은 아직 아무 효과도 없다 (속도가 안 바뀐다). 이 일감은 표시까지다.
할 일
- [x]
PlayerDataModel—ServerPacketHandler.CharacterSynced구독·해제,_characters에서CharacterId로 찾아 교체한 뒤CharactersChanged발행. 목록에 없는 개체가 오면 추가하지 말고 경고만 남긴다 — 목록의 원본은 스냅샷이다 (2026-09-16) - [x] 인벤토리 캐릭터 칸에 레벨 표시 → 게이지 오른쪽 아래 배지
LV.19· 만렙LV.MAX(2026-09-16. 이름 줄 → 아이콘 모서리 → 게이지 옆으로 옮겼다 — 글자 축소 · 초상화 형태에 따라 붕 뜨는 문제) - [x] 경험치 진행
Exp / RequiredExp(Level+1)→ 호버(T-050)가 아니라 칸 왼쪽 벽의 세로 게이지로 (2026-09-16 결정) 아이콘과 같은 높이 · 아래→위로 찬다 · 만렙이면 가득.SlotView.prefab에Exp Gauge(표시 전용Slider) 추가.RequiredExp는GameDataLoader.TryGetRequiredExp가 읽는다 — T-050을 기다리지 않게 됐다 - [x] 플레이 확인 (2026-09-16 사용자 확인) — 배치한 캐릭터의 게이지가 정산마다 차오르고, 레벨업 시 배지 숫자가 오르며 게이지가 줄어드는지 · 칸이 프레임을 빈틈 없이 채우는지 · 재로그인해도 같은지
- [ ] 🎨 레벨업 연출 (칸 반짝임·토스트) — 뒤로.
PlayerDataModel.OnCharacterSynced에 TODO 자리를 표시해 뒀다
완료 조건
슬롯에 배치한 캐릭터를 두고 기다리면 재로그인 없이 인벤토리 칸의 레벨이 오르고, 칸의 세로 게이지에서 경험치가 차오르는 것이 보인다. 재로그인해도 같은 값이다.
막고 있는 것 / 선행 일감
- 없음 — 패킷·이벤트·테이블이 전부 들어와 있다. 서버 구현은
87d0243으로 main에 있다 T-050(호버 UI)이 먼저 서면 경험치 진행은 거기에 얹는다→ 칸 안 게이지로 결정해 T-050과 무관해졌다
관련 커밋
5b8939e— 경험치 곡선 데이터(ExpPerJudge·CharacterLevelTable)0a2d2c5— 인벤토리 캐릭터 칸 레벨 배지 · 경험치 게이지 · 칸이 프레임을 채움
참고
- T-003 — 서버 쪽 구현 내역
Assets/Scripts_Client/Managers/PlayerDataModel.cs—OnCharacterListReceived가 스냅샷을 넣는 자리Assets/Scripts_Client/UI/Inventory/InventoryGridPresenter/CharacterSlotSource.cs— 캐릭터 칸 데이터 소스