Post Login, Logout

정혜창·2025년 3월 24일

독학

목록 보기
25/28
post-thumbnail

🎮 Post Login

PostLogin은 Unreal Engine에서 멀티플레이어 게임 개발 시, 서버에서 클라이언트가 로그인한 직후 호출되는 함수이다. 주로 AGameMode 또는 이를 상속한 커스텀 GameMode 클래스에서 사용되며, 클라이언트가 접속을 완료한 후 서버 측에서 플레이어 상태를 설정하거나 초기 데이터를 전달하는 등의 처리를 담당함.


1️⃣ 함수 정의

// GameModeBase.h
virtual void PostLogin(APlayerController* NewPlayer);
  • 호출 위치: 서버에서만 호출됨
  • 호출 타이밍: 클라이언트가 접속하여 PlayerController가 생성된 후, BeginPlay 직전에
  • 인자:
    • APlayerController* NewPlayer: 방금 로그인한 플레이어의 PlayerController

2️⃣ PostLogin의 호출 흐름 (서버 기준)

  1. 클라이언트가 서버에 접속 시도
  2. GameMode::PreLogin() 호출 → 접속 허용 여부 판단
  3. 접속이 허용되면 GameMode::InitNewPlayer() 호출
  4. PlayerController 생성 및 초기화
  5. GameMode::PostLogin() 호출
  6. PlayerController::BeginPlay() 호출
  7. 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️⃣ 주의 사항

  • 서버 전용 함수. 클라이언트에서는 호출되지 않음.
  • PlayerStatePostLogin 시점에 유효하므로 초기화 작업에 활용 가능
  • 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();
    }
}

profile
Unreal 1기

0개의 댓글