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

PlayerSession 처리 - 최종) UI를 통한 게임에 접속한 플레이어 표시

monstro 2026. 7. 23. 19:14
728x90
반응형

- 개요

로비에 UI를 추가하여 한 게임의 GameSession접속하는 플레이어들을 표시한다

 

- 스크립트 작업

1) LobbyState 클래스

 

 

GetPlayers 함수를 추가하여 PlayerInfoArray로부터 Players 변수를 반환한다

 

2) PlayerLabel 클래스

 

게임에 접속하는 플레이어에 대한 한 개의 행을 의미하는 PlayerLabel 클래스를 생성한다

멤버변수의 구성은 위와 같다

  • TexyBlock_UserName 멤버변수 : 플레이어의 이름을 보여주는 TextBlock UI

 

 

TextBlock UI에 대한 2개의 함수를 정의한다 

SetUserName 함수를 호출하여 TextBlock UI의 텍스트를 설정하고

GetUserName 함수를 호출하여 TextBlock UI의 텍스트를 가져온다

 

3) LobbyPlayerBox 클래스

 

PlayerLabel을 담고 있는 박스의 역할을 수행하는 LobbyPlayerBox 클래스를 생성한다

멤버변수의 구성은 위와 같다

  • ScrollBox_PlayerInfo 멤버변수 : PlayerLabel을 담고 있는 Scroll Box UI
  • PlayerLabelClass 멤버변수 : 표현할 PlayerLabelSubclass

 

 

FindPlayerLabel 함수를 위와 같이 정의한다

스크롤 박스 안에 있는 PlayerLabel을 가져와 인자로 받은 플레이어의 이름에 대한 PlayerLabel을 반환한다

 

 

OnPlayerRemoved 함수를 위와 같이 정의한다

인자로 받은 LobbyPlayerInfo의 플레이어에 대한 PlayerLabel을 스크롤 박스에서 제거한다

 

 

CreateAndAddPlayerLabel 함수의 로직을 위와 같이 정의한다

새로운 PlayerLabel을 생성하고 스크롤 박스에 추가한다

 

 

UpdatePlayerInfo 함수를 위와 같이 정의한다

스크롤 박스에 저장된 다른 UI들을 초기화하고 현재 로비에 존재하는 플레이어에 대한

LobbyPlayerInfo만큼 순회하면서 PlayerLabel을 생성하고 스크롤 박스에 추가한다

 

 

OnLobbyStateInitialized 함수를 위와 같이 정의한다

인자로 받은 LobbyStateOnPlayerInfoAddedOnPlayerInfoRemoved에 필요한 멤버 함수를 바인드하여

로비에 플레이어가 입장 / 퇴장하면 CreateAndAddPlayerLabel 함수와 OnPlayerRemoved 함수를 호출한다

 

 

위젯 생성 후에 한번만 호출하는 NativeOnInitialized 함수를 위와 같이 오버라이드한다

DSGameState의 LobbyState를 가져와 유효한지 체크한다

유효하다OnLobbyStateInitialized 함수에 LobbyState를 인자로 넘겨준다

유효하지 않다면 DSGameState의 OnLobbyStateInitialized 델리게이트에 OnLobbyStateInitialized 함수를 연결한다

 

4) DS_LobbyGameMode 클래스

 

CancleCountdown 멤버함수를 CheckAndStopLobbyCountdown 함수로 변경하고

위와 같이 3개의 새로운 함수를 추가한다

 

 

CheckAndStopLobbyCountdown 함수를 위와 같이 이름을 변경한다

 

 

CheckAndStartLobbyCountdown 함수를 위와 같이 추가한다

로비의 상태를 Seamless Travel 상태로 변경하고 카운트다운을 시작하는 기존 함수들의 로직을 함수로 구성하였다

 

 

AddPlayerInfoToLobbyState 함수의 로직을 위와 같이 정의한다

인자로 받은 플레이어에 대한 LobbyPlayerInfoDSGameStateLobbyState에 저장한다

 

 

RemovePlayerInfoFromLobbyState 함수의 로직을 위와 같이 정의한다

DSGameStateLobbyState에서 인자로 받은 플레이어에 대한 LobbyPlayerInfo를 제거한다

 

 

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

CheckAndStartLobbyCountdown 함수를 호출하여 Seamless Travel에 대한 카운트다운을 시작하고

AddPlayerInfoToLobbyState 함수를 호출하여 새로운 맵에 대해 재설정된 플레이어에 대한 LobbyPlayerInfo를 저장한다

 

 

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

CheckAndStopLobbyCountdown 함수를 호출하여 로비 상태를 변경하고 카운트다운을 중단한다

이후 로비 상태가 변경되었다면 RemovePlayerInfoFromLobbyState 함수를 호출한다

 

 

PostLogin 함수에서 CheckAndStartLobbyCountdown 함수를 호출하도록 수정한다

 

 

새로 접속한 플레이어의 PlayerController가 생성된 후에 호출하는 InitNewPlayer 함수에 로직을 추가한다

로비의 상태가 Seamless Travel이 아니라면,  AddPlayerInfoToLobbyState 함수를 호출하여

접속한 플레이어에게 생성된 PlayerControllerLobbyPlayerInfo를 저장한다

 

- 블루프린트 작업

1) WBP_LobbyPlayerLabel 위젯 블루프린트

 

위와 같이 구성된 PlayerLabel 위젯 블루프린트를 생성한다

하위 UI의 이름을 클래스의 멤버변수 이름과 통일한다

 

2) WBP_LobbyPlayerBox 위젯 블루프린트

 

1)에서 생성한 위젯 블루프린트를 포함하는 PlayerBox 위젯 블루프린트를 생성한다

동일하게 하위 UI의 이름과 클래스의 멤버변수 이름을 통일하였다

 

 

PlayerLabelClass 멤버변수1)에서 생성한 위젯 블루프린트로 설정한다

 

3) WBP_LobbyOverlay 위젯 블루프린트

 

로비에서 사용하는 Overlay 위젯 블루프린트2)에서 생성한 위젯 블루프린트를 추가한다

 

4) BP_LobbyGameMode 블루프린트

 

로비 레벨에서의 GameMode에서 사용할 GameState의 클래스를 위와 같이 설정한다

 

- 최종 실행 결과

# 1) 토큰 발급
aws gamelift get-compute-auth-token ^
--fleet-id "플릿 ID" ^
--compute-name "컴퓨팅 자원 이름" ^
--region "사용중인 리전" ^
--profile "프로필 이름" // 해당 옵션은 필요한 경우 사용

# 2) 발급된 토큰을 사용하여 서버 exe 파일 실행
"경로\Build\Build_5\운영체제Server\프로젝트Server.exe" -log -glAnywhere ^
-glAnywhereAuthToken="발급된토큰" ^
-glAnywhereHostId="컴퓨팅 자원 이름" ^
-glAnywhereFleetId="플릿 ID" ^
-glAnywhereWebSocketUrl="리전에 따른 소켓 URL" ^
-port=7777 // 기본 포트번호

 

이후 프로젝트를 패키징하여 Build_5 폴더에 저장한다

패키징이 끝난 후에 위와 같이 명령어를 입력하여 서버 exe 파일을 실행한다

 

728x90
반응형