배경
- 기존에는 Photon CustomRoomProperties를 사용해:
- InGameStartReady → 모든 준비 완료 후 프로퍼티에 CountdownStartTime, GameBeginTime을 기록
- OnRoomPropertiesUpdate 콜백에서 해당 프로퍼티를 읽어 각 클라이언트가 로컬 타이머 시작
- 하지만 네트워크 지연과 씬 로드 타이밍 차이로 클라이언트별 시작 시간이 달라지는 문제가 발생
핵심 학습 내용
- Photon RPC를 활용한 완전 동기화 방식 전환
- CustomRoomProperties 대신, 호스트(MasterClient)가 두 번의 RPC 호출로:
- RPC_NetworkedCountdown(double ctStart) → 5초 카운트다운 시작 시각을 모든 클라이언트에 전파
- RPC_BeginGameTimer(double serverBeginTime, int duration) → 카운트다운 종료 즉시 게임 타이머 시작 시점과 총 시간 전파
- CustomRoomProperties 대신, 호스트(MasterClient)가 두 번의 RPC 호출로:
- GameStartManager 구성 변경
- MonoBehaviourPun + PhotonView 필수
- 호스트만 OnAllPlayersInGameReadyEvent에서 두 개의 RPC를 순차 호출
- 카운트다운과 게임타이머 시작을 [PunRPC] 메서드로 구현
- GameManager에 서버 타이머 시작 공개 메서드 추가
- StartServerTimer(double beginTime, int duration)
- RPC 수신 시 해당 메서드 호출로 GameTimer 초기화
- GameTimer 내부 수정 불필요
- 이미 StartServerTimer / StartLocalTimer 로직을 지원하며, useServerTime 플래그로 분기 처리
결과
- 씬 로드 지연 차이와 상관없이, 모든 클라이언트가 동일한 서버 기준 시간으로
- 5초 카운트다운을 시작
- 카운트다운 종료 후 즉시 게임 타이머를 동시에 시작
- RPC 호출은 2회에 불과해 네트워크 부하가 거의 없음
느낀 점
- 작은 커스텀 프로퍼티 대신 직접 RPC를 사용하면 실시간 동기화에 더 유연하고 정확하다.
- PhotonNetwork.Time을 활용해 서버 기준 타임라인을 맞추는 패턴이 유용하다.
'Unity 개발 공부' 카테고리의 다른 글
| [내배캠] 본캠 86 Photon pun2 hashtable 관련 이슈 해결 ft: remove (3) | 2025.08.06 |
|---|---|
| [내배캠] 본캠 69 렌더링공부, 페인트칠 공부 (0) | 2025.07.14 |
| [내배캠] 본캠 63 쉐이더공부를 위한 기본이론공부 (6) | 2025.07.04 |
| [내배캠] 본캠 57 pun2 공부5 (2) | 2025.07.03 |
| [내배캠] 본캠 60 pun2 공부7, 시간 (1) | 2025.07.03 |