- 개요
진행중인 인게임을 의미하는 Match에 필요한 작업을 진행한다
매칭을 위한 GameMode 클래스를 추가하고 매칭의 3가지 상태를 위한 타이머 클래스를 생성한다
- 스크립트 작업
1) DSTypes 클래스

CountdownTimerHandle 구조체의 Type 멤버변수에 EditDefaultsOnly 속성을 추가하여
원본 블루프린트를 제외한 레벨에 생성된 인스턴스에서는 값을 수정할 수 없도록 설정한다

EMatchStatus 열거형 클래스를 추가하여 매칭의 상태를 표시한다
- 대기 상태
- Pre Match 상태
- Match 상태
- Post Match 상태
- 다른 레벨 이동 상태
2) DS_GameModeBase 클래스

프로젝트에서 사용할 GameMode의 조상 클래스를 위와 같이 생성한다
GameMode는 서버에만 존재하며 타이머들을 동작시켜 필요한 작업을 진행한다

UpdateCountdownTimer 함수의 로직은 위와 같이 구성한다
월드에 존재하는 DSPlayerController들을 찾아 순회하면서
Client_TimerUpdated RPC 함수를 서버에서 호출하여 클라이언트에서 수행한다

StartCountdownTimer 함수의 로직은 위와 같다
GameMode는 레벨이 전환되면 파괴될 수 있으므로
강한 참조가 아닌 약한 참조를 이용하여 델리게이트에 필요한 람다 함수를 바인드한다
위와 같이 타이머 핸들의 TimerFinishedDelegate에 람다 함수를 바인드하여
타이머의 시간이 다 되면, StopCountdownTimer 함수와 OnCountdownTimerFinished 함수를 호출한다
이후 SetTimer 함수를 호출하여 타이머의 종료가 한번만 실행되도록 설정한다
이어서 타이머 핸들의 TimerUpdateDelegate에 람다 함수를 바인드하여
시간이 갱신될 때마다 UpdateCountdowTimer 함수를 호출한다
이후 SetTimer 함수를 호출하여 타이머의 갱신이 계속 실행되도록 설정한다
최종적으로 강제 업데이트를 한번 진행한다

StopCountdownTimer 함수의 로직은 위와 같다
타이머 핸들의 상태를 멈춤으로 변경하고, 타이머 핸들의 델리게이트를 제거한다
이후, 델리게이트에 바인딩된 모든 콜백함수를 제거한다
마지막으로 월드에 있는 모든 DSPlayerController를 순회하면서
Client_TimerStopped RPC 함수를 서버에서 호출하여 클라이언트에서 수행한다

타이머가 종료되면 호출하는 OnCountdownTimerFinished 함수의 로직은 아직 구성하지 않았다
3) DS_MatchGameMode 클래스

매칭에 사용할 GameMode 클래스를 위와 같이 생성한다
멤버변수의 구성은 다음과 같다
- MatchStatus 멤버변수 : 현재 Match 상태
- PreMatchTimer 멤버변수 : Pre Match의 타이머 핸들
- MatchTimer 멤버변수 : Match의 타이머 핸들
- PostMatchTimer 멤버변수 : Post Match의 타이머 핸들

생성자를 위와 같이 구성한다
필요한 멤버변수들의 값을 설정하고, bUseSeamlessTravel 변수를 True로 설정하여 끊김없이 레벨을 전환한다

새로운 플레이어가 접속한 후에 호출하는 PostLogin 함수를 위와 같이 오버라이드한다
부모 버전의 함수를 호출하고, Match 상태가 대기 상태라면, Pre Match 상태로 변경하고 Pre Match 타이머를 동작시킨다

OnCountdownTimerFinished 함수를 위와 같이 오버라이드한다
인자로 받은 Match 상태에 따라 다르게 동작한다
- Pre Match 상태 : Match상태로 변경 + Match의 타이머 동작
- Match 상태 : Post Match 상태로 변경 + Post Match의 타이머 동작
- Post Match 상태 : 다른 레벨 이동 상태로 변경
4) DS_GameMode 클래스

DS_GameMode 클래스의 부모 클래스를 DS_GameModeBase 클래스로 변경한다
5) ShooterGameModeBase 클래스

ShooterGameModeBase 클래스의 부모 클래스를 DS_MatchGameMode 클래스로 변경한다
6) TimerWidget 클래스

타이머의 위젯 클래스를 추가한다
멤버변수의 구성은 위와 같다
- TimerType 멤버변수 : 타이머의 타입
- OwningPlayerController 멤버변수 : 현재 위젯을 소유하고 있는 PlayerController
- bActive 멤버변수 : 현재 타이머가 동작중인지 여부
- bCanBeNegative 멤버변수 : 타이머의 시간이 음수로 내려갈 수 있는지 여부
- bShowCentiSeconds 멤버변수 : 소수점 아래 시간 단위까지 화면에 표시할지 여부
- bHiddenWhenInactive 멤버변수 : 타이머가 작동하지 않을 때 화면에서 숨길지 여부
- TextBlock_Time 멤버변수 : 시간을 텍스트로 그려주는 UI
- InternalCountdown 멤버변수 : 실시간 남은 시간

위젯이 생성되고 단 한번 호출하는 NativeOnInitialized 함수를 위와 같이 구현한다
위젯을 소유한 DSPlayerController를 가져오고 델리게이트에 적합한 멤버함수를 연결한다
bHiddenWhenInactive 변수가 True라면 타이머 위젯을 숨겨놓는다

NativeTick 함수의 로직을 위와 같이 설정하여 bActive 변수가 True라면 카운트 다운을 시작한다

OnTimerUpdated 함수의 로직을 위와 같이 구성하여
bActive 변수가 False였다면 TimerStarted 함수를 호출하여 작동 상태로 전환하고
UpdateCountdown 함수를 호출하여 카운트 다운을 시작한다
이후, 블루프린트용 OnTimerUpdated 이벤트를 호출한다

OnTimerStopped 함수의 로직을 위와 같이 구성하여
TimerStopped 함수를 호출하여 멈춤 상태로 전환하고 블루프린트용 OnTimerStopped 이벤트를 호출한다

FormatTimeAsString 함수의 로직을 위와 같이 구현한다
인자로 받은 실수형의 TimeSeconds를 "00:00" 형태의 문자열로 변환한다

TimerStarted 함수의 로직을 위와 같이 설정하여
bActive 변수의 값을 True로 변경하고 투명도를 1로 설정하여 화면에 타이머 위젯을 표시한다

TimerStopped 함수의 로직을 위와 같이 변경하여
bActive 변수의 값을 False로 변경하고 카운트다운을 중단한다
이후 필요하다면 타이머 위젯을 다시 화면에서 숨긴다

UpdateCountdown 함수의 로직을 위와 같이 구성하여 숫자로 된 시간을 타이머 위젯에서 표시한다
- 블루프린트 작업
1) 매칭 타이머 위젯 블루프린트

Timer Type을 Pre Match + Match + Post Match로 설정한 3개의 매칭 타이머 위젯 블루프린트를 생성한다
2) BP_ShooterGameModeBase 블루프린트

위와 같이 매칭 타이머 별 카운트다운을 설정한다
3) WBP_ShooterOverlay 위젯 블루프린트

위와 같이 1 - 2 - 3의 순서로 매칭 타이머 위젯을 배치한다
각각, Pre Match - Match - Post Match 타이머 위젯 블루프린트이다
- 최종 실행 결과

'언리얼 엔진 - 게임 프로젝트 > AWS GameLift를 활용한 데디케이트 FPS 프로젝트' 카테고리의 다른 글
| 로비와 타이머 - 5) 로비 게임모드의 구성과 레벨 전환 (0) | 2026.07.05 |
|---|---|
| 로비와 타이머 - 4) 레벨 전환 및 서버 연결 상태에 따른 게임 데이터 보존과 관리 (0) | 2026.07.03 |
| 로비와 타이머 - 2) 타이머 핸들 + PlayerController 클래스 추가 (0) | 2026.06.26 |
| 로비와 타이머 - 1) 로비와 타이머 구성 (0) | 2026.06.26 |
| Access Tokens - 최종) 인증 헤더 추가 (0) | 2026.06.25 |