언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

PlayerSession 처리 - 1) PlayerSession 승인과 제거

monstro 2026. 7. 12. 14:54
728x90
반응형

- 개요

게임에 로그인한 플레이어PlayerSession승인하고 제거하는 로직을 추가한다

 

- 스크립트 작업

1) GameSessionsManager 클래스

 

CreatePlayerSessions_Response 함수에 위와 같이 로직을 추가한다

Options 로컬 변수를 사용하여 생성된 PlayerSession의 PlayerSessionIdPlayerId를 저장하고

레벨을 전환하면서 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를 파싱하여 PlayerSessionIdUserName을 저장하고

저장한 변수와 인자로 받은 ErrorMessageTryAcceptPlayerSession 멤버함수에 넘겨 호출한다

 

 

TryAcceptPlayerSession 함수의 로직은 위와 같다

AWS GameLift에 세션 정보 조회를 요청하여 로그인한 클라이언트를 대상으로 검증을 진행한다

최종적으로 검증을 통과한 클라이언트의 PlayerSessionId를 인자로 AcceptPlayerSession 함수를 호출하여 

AWS GameLift에 PlayerSession승인한다

 

 

InitNewPlayer 함수를 위와 같이 오버라이드한다

인자로 받은 PlayerContorllerDSPlayerController로 캐스팅하고

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 파일을 실행한다

 

플레이어가 게임에 접속한 후의 PlayerSession

 

플레이어가 게임에서 퇴장한 후의 PlayerSession

 

 

728x90
반응형