- 개요
접속한 플레이어별 PlayerSession을 사용하여 플레이어끼리의 매치 메이킹을 수행하는 공간인 로비를 추가하고,
또 서버가 권한을 갖는 시간 관리 주체인 타이머를 추가한다
타이머는 게임의 상태를 전환하는 역할 외에도 네트워크 지연을 고려하여 서버 - 클라이언트간의 시간을 동기화한다
타이머는 사용 목적에 따라 복수 개가 독립적으로 존재할 수 있도록 확장 가능한 구조로 설계한다
- 로비와 로비 타이머

로비에서는 PlayerSession을 승인하고, 적당한 수의 플레이어가 모일때까지 대기한다
플레이어의 수와 타이머의 시간에 따라 상태(State)가 변경되며, 다음과 같다
- 대기 상태 : 적합한 인원이 모일 때가지 대기
- 카운트다운 상태 : 적합한 인원이 모여 타이머가 작동
- Seamless Travel 상태 : 끊김없이 부드럽게 다음 레벨로 전환
- 매치 타이머

매치 타이머는 위와 같이 구성된다
3가지 방식으로 동작하며 플레이어들이 대기 + 본 게임 + 게임 종료의 방식으로 동작한다
매치 타이머도 동일하게 상태(State)를 변경하며 다음과 같이 구성된다
- 적합한 인원이 모일 때까지 대기
- Pre Match 상태 : 플레이어들이 레벨에 모두 진입한 상태 + 움직임이 제한됨
- Match 상태 : 본격적인 게임이 진행중인 상태
- Post Match 상태 : 게임 종료된 상태 + 유저의 데이터를 DB에 저장함
- Seamless Travel을 통해 필요한 다음 레벨로 이동
- 서버 - 클라이언트간의 동기화

위의 이미지는 서버 - 클라이언트간의 지연시간이 발생하는 원인과 이를 해결하는 방법을 의미한다
우선, 서버에서 클라이언트로의 단방향 지연 시간(STT)가 22ms이고, 그 반대는 18ms이다
이때 데이터가 출발해서 돌아오는 왕복 시간(RTT)는 2개의 STT를 더하여 40ms로 계산되었다
최종적으로 서버 - 클라이언트간의 단방향 지연 시간은 RTT 값을 2로 나눈 값인 20ms로 예측된다
이때 서버에서 타이머가 5초를 가리켜 5초의 데이터를 클라이언트에 전송하는 경우
클라이언트가 보는 5초의 데이터는 실제 서버보다 20ms 늦은 데이터를 수신받게 된다
따라서 클라이언트의 타이머를 정확하게 표시하려면 "서버가 보낸 시간 - 단방향 지연 시간"으로 계산해야 한다

최종적으로 위와 같이 구성하여 서버의 타이머가 갱신되는 TimerUpdate 신호마다
클라이언트의 타이머에서 최종 계산된 STT를 감산하는 방식으로 지연시간을 해결할 수 있다
- 최종 구성

최종적으로 타이머는 위와 같이 동작한다
CountdownTimerType 열거형 클래스를 추가하여 타이머의 타입을 정의한다
서버 전용의 GameMode 클래스에서 특정 타이머를 중지 + 실행한다
서버 + 클라이언트 모두에서 접근가능한 PlayerController 클래스를 통해 지연 시간을 보정한다
TimerWidget 클래스를 사용하여 보정된 시간을 화면 상에 표시한다
'언리얼 엔진 - 게임 프로젝트 > AWS GameLift를 활용한 데디케이트 FPS 프로젝트' 카테고리의 다른 글
| 로비와 타이머 - 3) 매칭 게임 모드와 타이머 추가 (0) | 2026.07.02 |
|---|---|
| 로비와 타이머 - 2) 타이머 핸들 + PlayerController 클래스 추가 (0) | 2026.06.26 |
| Access Tokens - 최종) 인증 헤더 추가 (0) | 2026.06.25 |
| Access Tokens - 12) PreToken 람다 트리거 생성 (0) | 2026.06.25 |
| Access Tokens - 11) 리소스 서버 설정 (0) | 2026.06.21 |