Framework 로딩 순서

Gameplay Framework를 사용할 때 가장 많이 발생하는 문제는 “이 시점에 이 객체가 아직 없는데 접근하는 것”이다.

UEngine 초기화
↓
UGameInstance 생성
↓
UWorld 생성
↓
GameMode 생성
↓
GameState 생성
↓
PlayerController 생성
↓
GameMode::RestartPlayer()
↓
DefaultPawn Spawn
↓
PlayerController::Possess(Pawn)
↓
PlayerState 생성/연결
↓
BeginPlay

시점별 주의사항

시점 가능한 작업 주의할 점
UGameInstance::Init() 글로벌 설정 로드, SaveGame 로드, Subsystem 초기화 World, GameMode, UI 접근 금지
GameMode 생성자 기본 클래스 설정, 규칙 변수 초기화 GameState, PlayerController 접근 금지
PostInitializeComponents() GameState 접근 가능 PlayerController, PlayerState는 아직 없을 수 있음
BeginPlay() 일반적인 게임 로직 시작 Actor 간 BeginPlay 호출 순서는 보장되지 않음
PostLogin() PlayerController, PlayerState 접근 플레이어 초기화에 적합
StartPlay() 게임 시작 처리 BeginPlay 이후 흐름 처리에 적합

의존 객체가 확실히 필요하다면 BeginPlay()보다 PostLogin()이나 명시적인 초기화 함수를 사용하는 것이 안전.

레벨 전환과 PlayerState

레벨 전환 시 GameModeGameState는 기본적으로 새 레벨에서 다시 생성된다.

PlayerState는 Seamless Travel에서 유지되는 것처럼 보이지만, 실제로는 같은 인스턴스가 그대로 이동하는 것이 아니라 이전 PlayerState의 데이터가 새 PlayerState로 복사된다.

이때 사용하는 함수가 CopyProperties()다.

void AMyPlayerState::CopyProperties(APlayerState* NewPlayerState)
{
    Super::CopyProperties(NewPlayerState);

    if (AMyPlayerState* NewPS = Cast<AMyPlayerState>(NewPlayerState))
    {
        NewPS->CurrentScore = CurrentScore;
        NewPS->TeamId = TeamId;
    }
}

레벨 전환 중에는 World, PlayerState, Pawn의 상태가 일시적으로 불안정할 수 있음

로직 위치 결정 기준

로직 위치
입력 처리 APlayerController
UI 생성과 입력 모드 관리 APlayerController, ULocalPlayerSubsystem
게임 규칙, 승패 판정 AGameMode
클라이언트가 봐야 하는 매치 상태 AGameState
플레이어 개인 점수, 팀, 이름 APlayerState
이동, 물리, 애니메이션 ACharacter, Movement Component, MoverComponent(Beta)
전투, 인벤토리, 스탯 UActorComponent
저장, 통계, 전역 서비스 적절한 Subsystem

빠른 참조표

클래스 존재 범위 담아야 하는 것
UGameInstance 게임 세션 전체 레벨 전환 후에도 유지되는 데이터, Subsystem
UWorld / ULevel 현재 월드 / 맵 파일 런타임 컨테이너, .umap
AGameMode 서버 전용 게임 규칙, 승패, 스폰 결정
AGameState 서버 + 모든 클라이언트 매치 공통 정보, PlayerArray
APlayerController 서버 + 소유 클라이언트 입력, UI, 카메라, Pawn 조종
AAIController 주로 서버 AI 로직, Behavior Tree, Perception
APlayerState 서버 + 모든 클라이언트 점수, 이름, 팀, 핑
APawn / ACharacter 서버 + 모든 클라이언트 월드 내 물리적 존재, 단기 상태
AHUD 로컬 전용 단순 2D 표시, 디버그 UI
APlayerCameraManager 서버 + 소유 클라이언트 최종 카메라 상태

  • 게임 규칙은 GameMode
  • 공유 상태는 GameState
  • 플레이어 개인 상태는 PlayerState
  • 레벨을 넘어 유지되는 정보는 GameInstance
  • 월드에서 실제 움직이는 몸체는 Pawn 또는 Character
  • 입력과 UI 주체는 PlayerController
  • 기능 단위 로직은 ActorComponent
  • 전역성 기능은 적절한 Subsystem
반응형

'Unreal Engine' 카테고리의 다른 글

GameplayTag Static vs GameplayTag Extern  (0) 2026.06.22
AssetManager  (0) 2026.06.19
UE Game play Framework 1  (0) 2026.06.17
GAS 2  (0) 2026.06.16
GAS 1  (0) 2026.06.15