🎮 Post Login
PostLogin은 Unreal Engine에서 멀티플레이어 게임 개발 시, 서버에서 클라이언트가 로그인한 직후 호출되는 함수이다. 주로 AGameMode 또는 이를 상속한 커스텀 GameMode 클래스에서 사용되며, 클라이언트가 접속을 완료한 후 서버 측에서 플레이어 상태를 설정하거나 초기 데이터를 전달하는 등의 처리를 담당함.
1️⃣ 함수 정의
// GameModeBase.h
virtual void PostLogin(APlayerController* NewPlayer);
- 호출 위치: 서버에서만 호출됨
- 호출 타이밍: 클라이언트가 접속하여
PlayerController가 생성된 후, BeginPlay 직전에
- 인자:
APlayerController* NewPlayer: 방금 로그인한 플레이어의 PlayerController
2️⃣ PostLogin의 호출 흐름 (서버 기준)
- 클라이언트가 서버에 접속 시도
GameMode::PreLogin() 호출 → 접속 허용 여부 판단
- 접속이 허용되면
GameMode::InitNewPlayer() 호출
PlayerController 생성 및 초기화
GameMode::PostLogin() 호출
PlayerController::BeginPlay() 호출
Pawn이 스폰되면 Possess() → 게임 시작
3️⃣ PostLogin에서 주로 하는 작업들
| 작업 | 설명 |
|---|
| 플레이어 카운트 증가 | 현재 접속 중인 플레이어 수를 추적 |
커스텀 PlayerState 설정 | 닉네임, 팀, 점수 등의 정보 초기화 |
| 클라이언트에게 초기 데이터 전송 | UI 세팅, 캐릭터 정보 등 |
| 게임 시작 조건 검사 | 일정 수 이상의 플레이어가 모였는지 확인 |
| 로그 출력 | 디버깅 또는 서버 로그 기록 |
4️⃣ 사용 예시
📋 GameMode.cpp
void AMyGameMode::PostLogin(APlayerController* NewPlayer)
{
Super::PostLogin(NewPlayer);
// 플레이어 수 증가
CurrentPlayerCount++;
// PlayerState 가져오기
AMyPlayerState* MyState = Cast<AMyPlayerState>(NewPlayer->PlayerState);
if (MyState)
{
MyState->SetPlayerName(FString::Printf(TEXT("Player%d"), CurrentPlayerCount));
}
// 로그 출력
UE_LOG(LogTemp, Log, TEXT("PostLogin: %s has joined the game."), *NewPlayer->GetName());
// 게임 시작 체크
if (CurrentPlayerCount >= 2)
{
StartGame();
}
}
5️⃣ 주의 사항
- 서버 전용 함수. 클라이언트에서는 호출되지 않음.
PlayerState는 PostLogin 시점에 유효하므로 초기화 작업에 활용 가능
Pawn은 아직 스폰되지 않은 상태일 수 있으므로 직접 접근할 때 주의
PlayerController::BeginPlay()보다 먼저 호출됨.
6️⃣ 관련 함수들과의 비교
| 함수 | 호출 위치 | 타이밍 | 주요 목적 |
|---|
PreLogin() | 서버 | 접속 시도 직후 | 접속 허용 여부 검사 |
InitNewPlayer() | 서버 | 접속 승인 후 | PlayerController 생성 및 초기화 |
PostLogin() | 서버 | 로그인 완료 후 | 상태 설정, 초기화, 알림 등 |
BeginPlay() | 클라이언트/서버 | 모든 초기화 이후 | 실제 게임 시작 |
7️⃣ 멀티플레이에서의 활용
- 각 플레이어가 접속하면
PostLogin에서 PlayerState에 닉네임, 역할(Host/Guest) 설정
- Host와 Guest 역할을 랜덤 혹은 접속 순서에 따라 지정
- 모든 플레이어가 접속하면 자동으로 채팅 기반 UI 초기화 및 게임 시작 신호 전달
🎮 Logout
Logout()은 플레이어가 서버에서 퇴장할 때 서버에서 호출되는 함수이다.
보통 PostLogin()의 반대 역할을 하며, 클린업(정리) 작업에 사용.
1️⃣ 함수 정의
// GameModeBase.h
virtual void Logout(AController* Exiting);
- 호출 위치: 서버
- 호출 시점: 클라이언트가 연결을 끊을 때 (자발적 퇴장, 네트워크 끊김 등)
- 인자:
AController* Exiting: 나가는 플레이어의 컨트롤러 (보통 APlayerController)
2️⃣ 주요 역할
| 작업 | 설명 |
|---|
| 플레이어 수 감소 | 게임 상태 업데이트 |
| PlayerState 정리 | 점수 기록 저장 등 |
| 재접속 지원 | 필요 시 식별자 저장 |
| 게임 상태 체크 | 남은 플레이어 수에 따라 게임 리셋 또는 종료 |
| 로그 남기기 | 디버깅 또는 운영 기록용 |
3️⃣ 사용 예시
void AMyGameMode::Logout(AController* Exiting)
{
Super::Logout(Exiting);
CurrentPlayerCount--;
AMyPlayerController* PC = Cast<AMyPlayerController>(Exiting);
if (PC && PC->PlayerState)
{
UE_LOG(LogTemp, Warning, TEXT("%s has left the game."), *PC->PlayerState->GetPlayerName());
}
if (CurrentPlayerCount <= 0)
{
ResetGame();
}
}