- 개요
게임에 로그인한 플레이어의 PlayerSession을 승인하고 제거하는 로직을 추가한다
- 스크립트 작업
1) GameSessionsManager 클래스

CreatePlayerSessions_Response 함수에 위와 같이 로직을 추가한다
Options 로컬 변수를 사용하여 생성된 PlayerSession의 PlayerSessionId와 PlayerId를 저장하고
레벨을 전환하면서 Options 로컬 변수를 넘겨주도록 수정한다
2) DSPlayerController 클래스


PlayerController에 Username 변수와 PlayerSessionId 변수를 추가한다
각각의 변수를 사용하여 플레이어의 이름과 PlayerSessionId를 저장한다
생성자에서 추가한 두 개의 변수를 초기화한다
3) DS_GameModeBase 클래스


RemovePlayerSession 함수를 추가하여 위와 같이 구현한다
로그아웃하는 플레이어의 DSController를 가져와 PlayerSessionId 변수를 가져오고
가져온 PlayerSessionId를 RemovePlayerSession 함수에 넘겨주어 PlayerSession을 제거한다

StartCountdownTimer 함수를 위와 같이 수정하여
실행 중인 델리게이트 내부에서 람다 함수 자기 자신을 해제하여 발생할 수 있는 오류를 방지하고,
카운트 다운에 따른 실행 흐름을 완전히 GameMode에 이관한다
4) DS_LobbyGameMode 클래스

로비에서의 GameMode 클래스에 위와 같이 함수를 추가한다
PreLogin 함수는 클라이언트가 서버에 연결을 시도할 때 가장 먼저 호출한다
InitNewPlayer 함수는 Login 함수 호출후에 접속한 플레이어의 PlayerController가 생성된 후에 호출한다

PreLogin 함수를 위와 같이 오버라이드한다
인자로 받은 Options를 파싱하여 PlayerSessionId와 UserName을 저장하고
저장한 변수와 인자로 받은 ErrorMessage를 TryAcceptPlayerSession 멤버함수에 넘겨 호출한다

TryAcceptPlayerSession 함수의 로직은 위와 같다
AWS GameLift에 세션 정보 조회를 요청하여 로그인한 클라이언트를 대상으로 검증을 진행한다
최종적으로 검증을 통과한 클라이언트의 PlayerSessionId를 인자로 AcceptPlayerSession 함수를 호출하여
AWS GameLift에 PlayerSession을 승인한다

InitNewPlayer 함수를 위와 같이 오버라이드한다
인자로 받은 PlayerContorller를 DSPlayerController로 캐스팅하고
PlayerSessionId 변수와 UserName 변수의 값을 설정한다

OnCountdownTimerFinished 함수에 로직을 추가하여 로비 GameMode를 통해 로비의 타이머를 종료시킨다

Logout 함수에서 RemovePlayerSessions 함수를 호출하여 로그아웃한 플레이어의 PlayerSession을 제거한다
5) DS_MatchGameMode 클래스

인게임의 GameMode 클래스에 Logout 함수와 InitSeamlessTravelPlayer 함수를 추가한다
Logout 함수는 플레이어가 서버와의 연결을 끊고 방을 나갈 때 서버에서 가장 마지막으로 호출된다
InitSeamlessTravelPlayer 함수는 Seamless Travel된 기존 플레이어를 새로운 맵에 맞게 재설정한다

Logout 함수를 위와 같이 오버라이드하여 퇴장한 플레이어의 PlayerSession을 제거한다

InitSeamlessTravelPlayer 함수를 위와 같이 오버라이드하여
플레이어를 대기중인 상태라면 PreMatch 상태로 변경하고 Pre Match 타이머를 동작시킨다

OnCountdownTimerFinished 함수에 위와 같이 로직을 추가하여
인게임 GameMode를 통해 타이머를 종료시킨다
- 스크립트 수정
스크립트를 작업한 후에 서버 패키징과 클라이언트 패키징을 진행하던 중에
클라이언트 패키징 과정에서 GameLiftServerSDK 헤더 파일을 참조하지 못해 에러가 발생하였다
따라서 코드의 구조를 일부 수정하여 클라이언트 패키징의 문제를 해결한다
1) DS_LobbyGameMode 클래스

GameLiftServerSDK 헤더 파일을 if 매크로로 감싸 서버에서만 포함한다

SerServerParameters 함수의 선언부도 동일하게 if 매크로로 감싸서 서버에서만 호출하도록 설정한다

InitGameLift 함수의 로직을 if 매크로로 감싸서 서버에서만 로직을 수행할 수 있도록 설정한다
2) DS_GameInstanceSubsystem 클래스

1)의 작업과 동일하게 서버에서만 사용하는 헤더 파일, 멤버 함수와 멤버 변수를 if 매크로로 감싸서 정의한다

InitGameLift 함수의 정의부를 전부 if 매크로로 감싸서 서버에서만 해당 함수를 호출하고 사용하도록 설정한다

ParseCommandLinePort 함수의 로직을 위와 같이 수정하여
클라이언트에서는 인자로 받은 OutPort에 파싱한 포트를 저장하고
서버라면 ProcessParameters 변수의 port 값에 파싱한 포트를 저장한다
- 최종 실행 결과
# 1) 토큰 발급
aws gamelift get-compute-auth-token ^
--fleet-id "플릿 ID" ^
--compute-name "컴퓨팅 자원 이름" ^
--region "사용중인 리전" ^
--profile "프로필 이름" // 해당 옵션은 필요한 경우 사용
# 2) 발급된 토큰을 사용하여 서버 exe 파일 실행
"경로\Build\Build_4\운영체제Server\프로젝트Server.exe" -log -glAnywhere ^
-glAnywhereAuthToken="발급된토큰" ^
-glAnywhereHostId="컴퓨팅 자원 이름" ^
-glAnywhereFleetId="플릿 ID" ^
-glAnywhereWebSocketUrl="리전에 따른 소켓 URL" ^
-port=7777 // 기본 포트번호
AWS CLI를 실행하고 위와 같이 명령어를 입력하여 Build_4 폴더에 저장된 서버 exe 파일을 실행한다


'언리얼 엔진 - 게임 프로젝트 > AWS GameLift를 활용한 데디케이트 FPS 프로젝트' 카테고리의 다른 글
| PlayerSession 처리 - 3) AInfo 클래스와 AGameState 클래스 (0) | 2026.07.16 |
|---|---|
| PlayerSession 처리 - 2) FastArraySerializer의 사용 (0) | 2026.07.16 |
| 로비와 타이머 - 최종) 퇴장 버튼과 타이머 개선 (0) | 2026.07.10 |
| 로비와 타이머 - 6) 플레이어 입력 제한 (0) | 2026.07.09 |
| 로비와 타이머 - 5) 로비 게임모드의 구성과 레벨 전환 (0) | 2026.07.05 |