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
레벨 전환 시 GameMode와 GameState는 기본적으로 새 레벨에서 다시 생성된다.
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 |