- 개요
로비에 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 멤버변수 : 표현할 PlayerLabel의 Subclass

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

OnPlayerRemoved 함수를 위와 같이 정의한다
인자로 받은 LobbyPlayerInfo의 플레이어에 대한 PlayerLabel을 스크롤 박스에서 제거한다

CreateAndAddPlayerLabel 함수의 로직을 위와 같이 정의한다
새로운 PlayerLabel을 생성하고 스크롤 박스에 추가한다

UpdatePlayerInfo 함수를 위와 같이 정의한다
스크롤 박스에 저장된 다른 UI들을 초기화하고 현재 로비에 존재하는 플레이어에 대한
LobbyPlayerInfo만큼 순회하면서 PlayerLabel을 생성하고 스크롤 박스에 추가한다

OnLobbyStateInitialized 함수를 위와 같이 정의한다
인자로 받은 LobbyState의 OnPlayerInfoAdded와 OnPlayerInfoRemoved에 필요한 멤버 함수를 바인드하여
로비에 플레이어가 입장 / 퇴장하면 CreateAndAddPlayerLabel 함수와 OnPlayerRemoved 함수를 호출한다

위젯 생성 후에 한번만 호출하는 NativeOnInitialized 함수를 위와 같이 오버라이드한다
DSGameState의 LobbyState를 가져와 유효한지 체크한다
유효하다면 OnLobbyStateInitialized 함수에 LobbyState를 인자로 넘겨준다
유효하지 않다면 DSGameState의 OnLobbyStateInitialized 델리게이트에 OnLobbyStateInitialized 함수를 연결한다
4) DS_LobbyGameMode 클래스

CancleCountdown 멤버함수를 CheckAndStopLobbyCountdown 함수로 변경하고
위와 같이 3개의 새로운 함수를 추가한다

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

CheckAndStartLobbyCountdown 함수를 위와 같이 추가한다
로비의 상태를 Seamless Travel 상태로 변경하고 카운트다운을 시작하는 기존 함수들의 로직을 함수로 구성하였다

AddPlayerInfoToLobbyState 함수의 로직을 위와 같이 정의한다
인자로 받은 플레이어에 대한 LobbyPlayerInfo를 DSGameState의 LobbyState에 저장한다

RemovePlayerInfoFromLobbyState 함수의 로직을 위와 같이 정의한다
DSGameState의 LobbyState에서 인자로 받은 플레이어에 대한 LobbyPlayerInfo를 제거한다

InitSeamlessTravelPlayer 함수에 위와 같이 로직을 추가한다
CheckAndStartLobbyCountdown 함수를 호출하여 Seamless Travel에 대한 카운트다운을 시작하고
AddPlayerInfoToLobbyState 함수를 호출하여 새로운 맵에 대해 재설정된 플레이어에 대한 LobbyPlayerInfo를 저장한다

Logout 함수에 위와 같이 로직을 추가한다
CheckAndStopLobbyCountdown 함수를 호출하여 로비 상태를 변경하고 카운트다운을 중단한다
이후 로비 상태가 변경되었다면 RemovePlayerInfoFromLobbyState 함수를 호출한다

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

새로 접속한 플레이어의 PlayerController가 생성된 후에 호출하는 InitNewPlayer 함수에 로직을 추가한다
로비의 상태가 Seamless Travel이 아니라면, AddPlayerInfoToLobbyState 함수를 호출하여
접속한 플레이어에게 생성된 PlayerController의 LobbyPlayerInfo를 저장한다
- 블루프린트 작업
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 파일을 실행한다

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