본문으로 건너뛰기
Unreal Engine 멀티플레이LESSON 26

접속, 퇴장, 플레이어 목록 처리하기

난이도입문 → 초급
예상 시간85분
선수지식25강의 서버 권한 월드 Actor

26강. 접속, 퇴장, 플레이어 목록 처리하기

1. 이번 강의에서 해결할 문제​

플레이어 목록을 각 클라이언트가 직접 추가·삭제하면 접속 순서와 퇴장 타이밍에 따라 서로 다른 명단을 봅니다. Pawn 목록만 사용하면 Respawn 순간 플레이어가 사라진 것처럼 보입니다. 연결 수명과 플레이어 상태 수명을 기준으로 서버가 팀을 배정하고 PlayerState를 복제해야 합니다.

2. 학습 목표​

3. 핵심 개념​

GameMode의 접속 콜백은 서버에만 있습니다. 서버는 새 PlayerController의 PlayerState에 TeamId와 초기 준비 상태를 지정합니다. GameState의 PlayerArray는 PlayerState 목록을 제공하며 클라이언트 UI는 이 배열과 각 PlayerState RepNotify를 읽습니다.

퇴장 중에는 Pawn, Controller, PlayerState 제거 순서와 복제 지연이 있을 수 있으므로 null·PendingKill을 고려하고 배열 인덱스를 영구 Player ID처럼 사용하지 않습니다. 개인정보 대신 게임 내 표시 이름과 서버가 부여한 임시 식별자를 사용합니다.

4. 단계별 실습​

CaptureArenaGameMode.cpp
void ACaptureArenaGameMode::PostLogin(APlayerController* NewPlayer)
{
Super::PostLogin(NewPlayer);
if (!HasAuthority() || !NewPlayer) return;

ACaptureArenaPlayerState* PS =
NewPlayer->GetPlayerState<ACaptureArenaPlayerState>();
if (!PS) return;

PS->SetTeamIdOnServer(ChooseBalancedTeam());
PS->SetReadyOnServer(false, 0);

UE_LOG(LogTemp, Display, TEXT("Player joined PS=%s Team=%d Count=%d"),
*GetNameSafe(PS), PS->GetTeamId(),
GameState ? GameState->PlayerArray.Num() : -1);
}

void ACaptureArenaGameMode::Logout(AController* Exiting)
{
const APlayerState* LeavingState = Exiting ? Exiting->PlayerState : nullptr;
UE_LOG(LogTemp, Display, TEXT("Player leaving PS=%s"),
*GetNameSafe(LeavingState));

RemovePlayerFromCaptureZones(LeavingState);
Super::Logout(Exiting);
ReevaluateLobbyAndMatchState();
}
CaptureRosterWidget.cpp
void UCaptureRosterWidget::RefreshFromGameState()
{
const UWorld* World = GetWorld();
const AGameStateBase* GS = World ? World->GetGameState() : nullptr;
if (!GS) return;

TArray<const ACaptureArenaPlayerState*> Players;
for (const APlayerState* BaseState : GS->PlayerArray)
{
if (const ACaptureArenaPlayerState* PS =
Cast<ACaptureArenaPlayerState>(BaseState))
{
Players.Add(PS);
}
}
RebuildRows(Players);
}

UI는 PlayerArray를 Tick마다 다시 만들기보다 PlayerState 변경 Delegate와 접속 변화 알림 시 Refresh합니다. 작은 2인 과정에서는 전체 재빌드가 충분하지만 대규모 명단에서는 증분 구조를 검토합니다.

5. 코드가 동작하는 이유​

PostLogin·Logout은 서버 연결 수명에 맞춰 실행되어 팀과 경기 참여를 권위 있게 관리합니다. PlayerState는 Pawn과 분리되어 Respawn에도 유지되고 GameState PlayerArray가 클라이언트에 복제되므로 각 UI가 같은 플레이어 집합을 읽습니다. 서버는 퇴장 플레이어를 점령 지점 집계에서 먼저 제거해 유령 점령을 막습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

접속, 퇴장, 플레이어 목록 처리하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“접속, 퇴장, 플레이어 목록 처리하기”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“접속, 퇴장, 플레이어 목록 처리하기” 실습 중 ‘Pawn 배열을 플레이어 목록으로 사용’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

26강. 접속, 퇴장, 플레이어 목록 처리하기 미완료 상태