본문 바로가기

Unity 개발 공부

[내배캠] 본캠 81 게임 씬 카운트다운 및 게임 타이머 동기화 via Photon RPC

배경

  • 기존에는 Photon CustomRoomProperties를 사용해:
    • InGameStartReady → 모든 준비 완료 후 프로퍼티에 CountdownStartTime, GameBeginTime을 기록
    • OnRoomPropertiesUpdate 콜백에서 해당 프로퍼티를 읽어 각 클라이언트가 로컬 타이머 시작
  • 하지만 네트워크 지연과 씬 로드 타이밍 차이로 클라이언트별 시작 시간이 달라지는 문제가 발생

핵심 학습 내용

  1. Photon RPC를 활용한 완전 동기화 방식 전환
    • CustomRoomProperties 대신, 호스트(MasterClient)가 두 번의 RPC 호출로:
      1. RPC_NetworkedCountdown(double ctStart) → 5초 카운트다운 시작 시각을 모든 클라이언트에 전파
      2. RPC_BeginGameTimer(double serverBeginTime, int duration) → 카운트다운 종료 즉시 게임 타이머 시작 시점과 총 시간 전파
  2. GameStartManager 구성 변경
    • MonoBehaviourPun + PhotonView 필수
    • 호스트만 OnAllPlayersInGameReadyEvent에서 두 개의 RPC를 순차 호출
    • 카운트다운과 게임타이머 시작을 [PunRPC] 메서드로 구현
  3. GameManager에 서버 타이머 시작 공개 메서드 추가
    • StartServerTimer(double beginTime, int duration)
    • RPC 수신 시 해당 메서드 호출로 GameTimer 초기화
  4. GameTimer 내부 수정 불필요
    • 이미 StartServerTimer / StartLocalTimer 로직을 지원하며, useServerTime 플래그로 분기 처리

결과

  • 씬 로드 지연 차이와 상관없이, 모든 클라이언트가 동일한 서버 기준 시간으로
    1. 5초 카운트다운을 시작
    2. 카운트다운 종료 후 즉시 게임 타이머를 동시에 시작
  • RPC 호출은 2회에 불과해 네트워크 부하가 거의 없음

느낀 점

  • 작은 커스텀 프로퍼티 대신 직접 RPC를 사용하면 실시간 동기화에 더 유연하고 정확하다.
  • PhotonNetwork.Time을 활용해 서버 기준 타임라인을 맞추는 패턴이 유용하다.