HANPAN — M3 진입 준비 스냅샷
1. 주요 변경사항
- 로비→룸→게임 전환을 자체
SceneLoader중심에서 NGO Scene Sync 기반 하이브리드로 전환했다. Core asmdef를 NGO-free로 유지한 결정은 구조적으로 타당하다. SessionErrorMessages, RateLimit backoff, silent refresh, 가득 찬 방 비활성화가 추가됐다. 사용자 경험과 운영 안정성 모두 실제로 개선됐다.BlackAndWhite_Spec.md가 신설되어 타일, 손패, state machine, 연장전, 이탈 정책이 코드화 가능한 수준으로 정리됐다.- 좀비 방 필터와 게임 시작 시
IsLocked처리가 들어갔다. M2 네트워크 로비의 가장 거슬리는 운영 버그를 직접 줄인 변경이다.
2. 코드 품질 리뷰
이번 변경은 방향이 좋다. 특히 NetworkSceneTransition을 HANPAN.Network에 두고 SceneLoader와 책임을 분리한 점은 칭찬할 만하다. NGO 참조를 Core로 끌어올리지 않은 판단 덕분에 이후 게임별 네트워크 코드가 늘어도 의존 방향이 무너지지 않는다. SessionErrorMessages도 raw exception 노출을 끊었다는 점에서 사용자용 UI와 디버그 로그의 경계를 명확히 했다.
다만 끊김 처리에는 즉시 고쳐야 할 결함이 있다. HandleSelfDisconnectedAsync에서 _session을 먼저 null로 만든 뒤 UnsubscribeSessionEvents()를 호출한다.
_session = null;
UnsubscribeSessionEvents();
이 순서면 기존 ISession의 PlayerJoined/PlayerLeaving/Changed 해제가 수행되지 않는다. 왜 문제냐면 끊김·재입장 반복 시 죽은 세션 객체에 콜백이 남아 중복 이벤트, 잘못된 UI 갱신, 추적 어려운 비동기 버그로 이어질 수 있기 때문이다. 개선은 단순하다. null 대입 전에 이벤트를 해제하거나, UnsubscribeSessionEvents(ISession session)처럼 해제 대상을 명시적으로 넘겨야 한다.
또 하나의 위험은 NetworkSceneTransition.Load가 실패를 로그로만 남기고 호출자에게 알려주지 않는 점이다. RoomUI.OnStartClicked는 시작 버튼을 비활성화한 뒤 복구 경로 없이 Load를 호출한다. NGO 미활성, 서버 아님, LoadScene 실패가 발생하면 UI가 “게임 시작 중…”에서 멈출 수 있다. 네트워크 코드에서 “로그만 찍고 UI는 대기”는 사용자 입장에서는 정지와 같다. bool 또는 status를 반환하고 실패 시 SetInteractable(true)와 사용자 메시지를 복구해야 한다.
3. 진행도 평가
M2의 로비·대기실·세션 안정화는 확실히 전진했다. 문서와 코드가 같은 방향으로 움직이고 있으며, 이전 리포트의 네트워크 안전망 부채도 상당 부분 줄었다. 이 점은 좋은 흐름이다.
다만 프로젝트 완성도는 아직 45% 수준으로 보는 것이 맞다. 이유는 명확하다. 방 생성과 대기실은 동작하지만, 실제 게임 본편인 흑과 백의 데이터 모델·라운드 진행·NetworkVariable 동기화·승패 처리는 아직 코드로 들어가지 않았다. 지금부터가 M3의 본게임이다.
4. 다음 권장사항
SessionManager.HandleSelfDisconnectedAsync의 이벤트 해제 순서를 먼저 고친다. 이 문제는 나중에 재현하기 어려운 중복 콜백 버그가 된다.NetworkSceneTransition.Load가 성공/실패를 반환하게 만들고,RoomUI에서 실패 시 버튼과 상태 문구를 복구한다.BlackAndWhite_Spec.md§2 기준으로Tile,Hand,GamePhase,RoundResult,MatchState를 먼저 구현한다.- 게임 씬 컨트롤러에서
OnPlayerLeft를 구독해 진행 중 이탈 시 게임 중단과 로비 복귀를 처리한다. - 방 목록 조회 실패를 빈 목록과 구분한다. 서버 장애를 “공개 방 없음”으로 보여주면 디버깅과 사용자 판단이 모두 틀어진다.
5. 문서화 상태
design은 7점이다. 전체 개발 계획과 Work Breakdown이 현재 진행 상태를 잘 반영하고, M3 진입 조건도 명확하다. 다만 플레이어 경험 목표나 각 게임 모드의 의도는 아직 컨셉 문서 의존도가 높다.
technical은 8점이다. Network_Authority.md가 씬 전환, 권한, 실패 처리, 재시도 정책을 실제 코드 변경과 연결하고 있다. 신규 참여자가 네트워크 경계를 이해하는 데 충분히 실용적이다.
spec은 8점이다. BlackAndWhite_Spec.md는 경계 조건과 서버 검증까지 포함해 바로 구현 가능한 수준이다. 단, 레벨/씬별 입력 매핑, HUD 상태, UI 전이 사양은 아직 전체 프로젝트 기준으로는 비어 있다.
6. Backlog
Base_01_LobbyUI 하드코딩 문제는 그대로 남아 있다. 지금은 기능 구현 우선이 맞지만, UI 반복 수정이 시작되면 비용이 커진다.- 레벨/씬별 상세 사양서는 아직 부족하다. 흑과 백 규칙은 해결됐지만, 씬별 HUD·입력·상태 전이 문서는 별도로 필요하다.
- 게임 본편의
Player Prefab사용 여부와MatchState단일 NetworkObject 전략은 아직 확정 전이다. - 수동 leave와 Multiplayer SDK 자동 leave 훅의 중복 가능성은 검증되지 않았다. M3 중 한 번은 정리해야 한다.
- URP 템플릿 튜토리얼과 Mobile 렌더러 잔존 자산은 아직 정리되지 않았다. 빌드 단계 전에는 제거해야 한다.
7. 이전 Backlog 해결
- 흑과 백 규칙 사양서 미작성 문제는 해결됐다.
README/5. BlackAndWhite_Spec.md가 데이터 모델, state machine, 종료 boundary, 이탈 정책까지 코드 기준으로 정리했다. - 네트워크 운영 규칙과 구현의 괴리는 상당 부분 해소됐다.
SessionManager에 자기 끊김 처리, RateLimit backoff, lock 처리 흐름이 들어갔고 문서도 이에 맞춰 갱신됐다.