HANPAN — PlayerState 네트워킹 전환 스냅샷
1. 주요 변경사항
MatchState의 A/B 하드코딩 상태를 제거하고, 플레이어별PlayerStateNetworkObject 구조를 도입했다.BlackAndWhiteController가 clientId 기반 hand/pending 상태를 관리하도록 바뀌었고, 라운드 결과는RoundResult이벤트를 명시적으로 사용한다.- LED 판정이 점수 증감 비교에서 라운드 결과 직접 판정으로 바뀐 점은 좋은 수정이다. 네트워크 동기화 순서에 덜 취약하다.
SessionManager.LeaveSessionAsync()에_hasLeft플래그를 추가해 수동 leave와 자동 disconnect 중복 호출을 막았다.README/4. Network_Authority.md가 v1.3으로 갱신되어 PlayerState Prefab 정책과 Leave 중복 보호를 문서화했다.
2. 코드 품질 리뷰
이번 변경의 방향성은 좋다. MatchState가 매치 공통 상태만 맡고, 점수·제출 여부·PendingColor를 PlayerState로 분리한 것은 이후 4~6인 게임으로 확장할 때 필요한 구조다. 특히 LED 판정을 점수 변화 추론이 아니라 RoundResult.Outcome으로 처리한 점은 명확하다. 이전 방식은 NetworkVariable 반영 순서에 기대는 코드였고, 이번 방식은 “무엇이 이겼는가”를 이벤트 데이터가 직접 말한다.
다만 현재 구현은 “전략 수립”과 “실행 가능한 Unity 자산 상태” 사이에 빈틈이 있다. diff에는 PlayerState.cs만 있고 PlayerState.prefab 생성이나 NetworkManager 등록 변경이 보이지 않는다. 이 상태면 FindNetworkPrefab<PlayerState>()가 null을 반환하고 게임 초기화가 중단된다. 문서에 에디터 작업을 적는 것으로는 부족하다. Prefab 자산과 등록 상태를 커밋하거나, 최소한 PlayMode 검증으로 누락을 바로 잡아야 한다.
가장 위험한 코드는 2인 전용 가정이 숨은 채 N인 확장처럼 보이는 부분이다. DealTiles()는 _playerStates.Count만큼 반복하지만 상대 인덱스를 1 - i로 계산한다. 3명 이상이 들어오면 즉시 깨진다. 또한 SurrenderServerRpc()는 호출자가 참가자인지 확인하지 않고 “호출자가 아닌 첫 PlayerState”를 승자로 처리한다. 왜 문제인지 분명하다. 네트워킹 코드에서 참가자 검증이 빠지면 잘못된 클라이언트가 게임 결과를 바꿀 수 있다. FindPlayerState(caller) == null이면 return하고, BlackAndWhite는 clients.Count == 2를 강제해야 한다.
3. 진행도 평가
이전 리포트 대비 네트워크 상태 모델은 확실히 전진했다. PlayerState 도입, Leave idempotent 처리, PendingColor 표시 조건 정리는 의미 있는 개선이다. 하지만 이번 커밋 5개 중 다수가 fix이고, 새 구조가 아직 Unity Prefab 등록과 런타임 검증까지 닫히지 않았다. 코드만 보면 플레이 가능성은 올라갔지만, 실제 에디터 실행 성공은 아직 확인되지 않은 상태다.
진행도는 48%로 본다. 핵심 게임 루프는 형태가 있지만, 네트워크 초기화 실패 가능성·2인 가정 미검증·씬/사양 문서 부채가 남아 있다. 다음 단계는 기능 추가가 아니라 “2인 플레이가 항상 재현되는 기준선”을 잠그는 것이다.
4. 다음 권장사항
- PlayerState Prefab 생성·NetworkManager 등록을 커밋으로 검증해야 한다. 문서가 아니라 실행 자산이 기준이다.
- 흑과 백 컨트롤러의 2인 전용 가정을 명시 검증으로 잠가야 한다.
clients.Count != 2는 즉시 실패 처리한다. SurrenderServerRpc호출자가 참가자인지 검증 후 게임 종료를 처리해야 한다.- PlayerState 바인딩 코루틴에 타임아웃·구독 해제·실패 UI를 추가해야 한다.
- RoundResult 기반 LED·보드 갱신이 지연 바인딩에도 유실되지 않도록 결과 버퍼나 재동기화 경로를 둔다.
- BlackAndWhite 씬 생성물과 Prefab 등록 상태를 자동 검증해 리뷰 비용을 줄인다.
5. 문서화 상태
design은 6점이다. 게임별 의도와 네트워크 방향은 잡혀 있으나, 플레이 경험 목표와 시스템 간 선택 이유가 아직 깊게 연결되지는 않았다.
technical은 7점이다. Network_Authority 문서는 이번에 크게 좋아졌다. 권한 매트릭스, Leave 중복 보호, PlayerState 생명주기가 들어간 점은 실무적으로 유효하다. 단, 실제 Prefab 등록 검증 절차가 자동화까지 이어지지 않아 8점 이상은 어렵다.
spec은 5점이다. 흑과 백 구현은 진행 중이나 입력 매핑, UI 상태 전이, HUD 수치, 씬별 완료 조건이 테스트 체크리스트 수준으로 정리되지 않았다. _sample/docs의 10점 기준과 비교하면 아직 “구현자가 그대로 따라 만들 수 있는 사양”은 아니다.
6. Backlog
- PlayerState Prefab 실제 자산 등록 검증 부재가 남아 있다. 현재 구조의 가장 직접적인 런타임 실패 위험이다.
- 레벨/씬별 상세 사양서 입력 매핑·UI 상태 전이·HUD 수치 부재가 계속 남아 있다.
Game_01_BlackAndWhite.unity생성물 커밋으로 리뷰 비용이 여전히 크다. 생성 규칙과 결과물 검증을 분리해야 한다.Base_01_Lobby.unityUI 구성이 씬 파일에 하드코딩된 문제도 유지된다.- Unity URP 템플릿 튜토리얼·Mobile 렌더러 등 불필요 자산 정리는 아직 진행되지 않았다.
7. 이전 Backlog 해결
- 게임 본편 NetworkObject/Player Prefab 전략 미확정은 해결로 본다.
PlayerState구조와 v1.3 네트워크 문서가 추가되어 방향은 확정됐다. 단, 실제 Prefab 등록 검증은 새 backlog로 남긴다. - 수동 leave 코드와 SDK 자동 leave 훅 중복 가능성 미검증은 해결됐다.
LeaveSessionAsync()단일 경로와_hasLeft플래그가 추가됐다. - PendingColor 미제출 기본값이 Black으로 노출될 여지는 해결됐다.
HasSubmitted == true일 때만 PendingColor를 읽는 구조로 바뀌었다.