나만의 작은 도서관

[TIL][C++] 250912 MMO 서버 개발 100일차: [언리얼] Game Mode의 Default Pawn Class의 역할 본문

Today I Learn

[TIL][C++] 250912 MMO 서버 개발 100일차: [언리얼] Game Mode의 Default Pawn Class의 역할

pledge24 2025. 9. 13. 21:56
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] Game Mode의 Default Pawn Class의 역할

  • Default Pawn Class는 게임 모드(Game Mode)의 핵심 설정 중 하나로, 맵이 시작되거나 새로운 플레이어가 접속할 때 생성되는 폰.

맵 시작 시 일어나는 과정들

  • 맵 시작: GameMode가 초기화
  • 플레이어 컨트롤러 스폰: GameMode가 PC를 스폰
  • 폰 스폰: PC는 맵에 배치된 PlayerStart위치에 폰을 스폰.
    • 만약 PlayerStart가 맵에 없다면 PC 위치에 폰이 스폰됨.
  • 빙의: 스폰된 폰에 PC가 자동으로 빙의된다.

 

디폴트 폰이 스폰되지 않는 예외 상황

  • 수동으로 폰 빙의: 게임 시작 시 PC가 다른 폰을 빙의하도록 설정한 경우
  • GameMode 설정 무시: 1) World Settings에서 GameMode를 오버라이드하여 다른 클래스로 설정하거나, 2) Player Start에 특정 폰을 설정하고 AutoPossessPlayer 옵션을 활성화한 경우
  • Player Start가 없는 경우: Player Start가 없으면 PC의 기본 위치에 폰이 스폰될 수 있음.

 

[언리얼] 캐릭터가 여러 개인 경우는 Default Pawn Class를 사용할 수는 없다.

  • 캐릭터의 종류가 여러 가지인 게임에서는 Default Pawn Class를 고정적으로 사용하는 방식을 사용할 수 없다. 이때는 GameInstance에 선택된 캐릭터의 정보를 넣어놓고 레벨에 입장할 때마다 가져와서 스폰해야 한다. 방법은 2가지가 있다.

 

방법 1) GameMode::GetDefaultPawnClassForController 오버라이드

TSubclassOf<APawn> AMyGameMode::GetDefaultPawnClassForController(AController* InController)
{
    if (const UMyGameInstance* GI = GetGameInstance<UMyGameInstance>())
    {
        if (GI->SelectedPawnClass)
        {
            return GI->SelectedPawnClass;
        }
    }
    return Super::GetDefaultPawnClassForController(InController);
}

 

 

방법 2) DefaultPawnClass = None + 직접 스폰 & Possess

  • GameMode의 BeginPlay나 PlayerController의 BeginPlay에서 해당 캐릭터를 스폰하고 Possess한다.
void AMyPlayerController::BeginPlay()
{
    Super::BeginPlay();
    
    if (UMyGameInstance* GI = GetGameInstance<UMyGameInstance>())
    {
        if (GI->SelectedPawnClass)
        {
            FActorSpawnParameters Params;
            Params.Owner = this;
            APawn* NewPawn = GetWorld()->SpawnActor<APawn>(GI->SelectedPawnClass, SpawnTransform, Params);
            Possess(NewPawn);
        }
    }
}