본문 바로가기

Gameplay Framework

@iamrain2025. 10. 27. 09:50

1. GameMode, PlayerController, Pawn, PlayerState, GameState의 역할

언리얼 엔진의 게임플레이 프레임워크는 게임을 구성하는 기본 요소들을 체계적으로 관리하기 위한 클래스들의 집합이다. 이 프레임워크의 핵심을 이루는 GameMode, PlayerController, Pawn, PlayerState, GameState는 각각 명확히 구분된 역할을 수행하며, 특히 멀티플레이어 게임 환경에서 이들의 관계와 데이터 흐름을 이해하는 것은 매우 중요하다. 각 클래스를 "누가, 무엇을, 어디서, 어떻게" 하는지에 대한 역할극으로 비유하면 이해하기 쉽다.

  • GameMode: 게임의 심판
  • GameState: 게임의 공용 전광판
  • PlayerController: 플레이어의 두뇌와 손
  • PlayerState: 플레이어의 개인 명찰/점수판
  • Pawn: 플레이어의 아바타

2. 각 클래스의 역할과 특징

A. AGameModeBase / AGameMode (게임 모드)

  • 역할: 게임의 규칙(Rules)을 정의하고 관리하는 심판.
  • 존재 위치: 서버에만 존재하며, 클라이언트에는 생성되거나 복제되지 않는다.
  • 주요 책임:
    • 게임의 승리/패배 조건, 매치 시간, 점수 획득 규칙 등을 정의한다.
    • 새로운 플레이어가 접속했을 때의 처리(PostLogin) 및 로그아웃 처리(Logout)를 담당한다.
    • 어떤 Pawn, PlayerController, GameState 등의 클래스를 기본으로 사용할지 결정한다.
    • 플레이어의 스폰 및 리스폰 위치를 찾고, Pawn을 생성하여 PlayerController에 빙의시키는 과정을 관리한다.
  • AGameMode vs AGameModeBase: AGameModeBase는 더 모듈화된 기본 클래스이며, AGameMode는 팀전, 매치 상태 관리 등 기존의 복잡한 게임 로직이 일부 포함된 상위 클래스다. 특별한 이유가 없다면 AGameModeBase에서 시작하는 것이 권장된다.

B. APlayerController (플레이어 컨트롤러)

  • 역할: 플레이어의 의지(Will) 또는 두뇌(Brain). 플레이어의 입력을 받아 게임 세계에 영향을 준다.
  • 존재 위치: 서버와 해당 플레이어의 클라이언트에만 존재한다. 서버의 버전이 권위(Authority)를 가진다.
  • 주요 책임:
    • 키보드, 마우스, 게임패드 등 플레이어의 입력을 받아 처리한다.
    • Pawn에 빙의(Possess)하여 Pawn을 조종한다. Pawn은 죽고 리스폰될 때 교체될 수 있지만, PlayerController는 일반적으로 레벨 내내 유지된다.
    • 플레이어의 카메라(PlayerCameraManager)를 관리한다.
    • HUD나 메뉴 같은 클라이언트 측 UI와의 상호작용을 담당한다.

C. APawn / ACharacter (폰 / 캐릭터)

  • 역할: 게임 세계에 존재하는 플레이어 또는 AI의 아바타(Avatar) 또는 육체(Body).
  • 존재 위치: 서버와 모든 클라이언트에 복제되어 존재한다. 서버 버전이 권위(Authority), 소유 클라이언트 버전이 자율 프록시(AutonomousProxy), 그 외 클라이언트 버전이 시뮬레이션 프록시(SimulatedProxy)다.
  • 주요 책임:
    • 게임 월드 내에서 물리적인 형태를 가지며, 시각적으로 표현된다.
    • 이동, 충돌 등 월드와의 상호작용을 직접 수행한다.
    • PlayerControllerAIController로부터 조종 명령을 받아서 움직인다.
  • APawn vs ACharacter: ACharacterPawn의 하위 클래스로, 이족보행에 특화된 기능들(걷기, 점프, 낙하 등)을 담당하는 CharacterMovementComponent가 내장되어 있어 인간형 캐릭터를 구현하는 데 주로 사용된다.

D. APlayerState (플레이어 스테이트)

  • 역할: 개별 플레이어의 상태 정보(State Info)를 담는 개인 점수판 또는 명찰.
  • 존재 위치: 서버와 모든 클라이언트에 복제되어 존재한다.
  • 주요 책임:
    • 모든 사람이 알아야 하는 특정 플레이어의 정보를 저장하고 동기화한다.
    • 예: 플레이어 이름, 점수, 킬/데스, 현재 핑, 소속 팀 등.
    • Pawn이 죽고 리스폰되어도 PlayerState는 유지되므로, 플레이어의 누적 데이터를 보관하기에 적합하다.
    • GameStatePlayerArray에 포함되어 모든 플레이어 목록을 구성한다.

E. AGameStateBase / AGameState (게임 스테이트)

  • 역할: 게임 전체의 공용 상태(Global State)를 담는 공용 전광판.
  • 존재 위치: 서버와 모든 클라이언트에 복제되어 존재한다.
  • 주요 책임:
    • 모든 플레이어가 알아야 하는 게임의 전반적인 상태를 저장하고 동기화한다.
    • 예: 매치 시작 여부, 남은 게임 시간, 팀별 총점, 맵 이름 등.
    • GameMode가 서버에만 존재하는 '규칙'이라면, GameState는 그 규칙에 따라 변화하는 '상태'를 모두에게 공유하는 역할을 한다.
    • 모든 PlayerState의 목록을 PlayerArray라는 배열로 가지고 있어, 현재 게임에 참여 중인 모든 플레이어의 정보를 순회할 수 있다.

3. 클래스 간 상호작용 및 데이터 흐름 (Player Join Flow)

  1. 접속: 클라이언트가 서버에 접속한다.
  2. 로그인: 서버의 GameMode에서 PostLogin 이벤트가 호출된다. GameMode는 이 플레이어를 위한 PlayerControllerPlayerState를 생성한다.
  3. 스폰: GameModeRestartPlayer() 함수를 호출하여 플레이어를 게임에 참여시킨다. 적절한 스폰 위치를 찾아 Pawn을 스폰하고, PlayerController가 이 Pawn에 빙의(Possess)하도록 한다.
  4. 입력 및 제어: 플레이어가 클라이언트에서 키를 누르면, 클라이언트의 PlayerController가 입력을 감지한다. 이 입력은 Server RPC를 통해 서버의 PlayerController로 전달된다.
  5. 액션 수행: 서버의 PlayerController는 명령을 받아 자신의 권위있는 Pawn에게 이동하라고 지시한다. Pawn의 위치가 변경된다.
  6. 상태 복제: Pawn의 변경된 위치(Transform)는 프로퍼티 복제를 통해 모든 클라이언트의 Pawn 프록시들에게 전송되어 부드럽게 움직이는 것처럼 보인다.
  7. 게임 이벤트: 플레이어가 적을 죽이면, GameMode가 이 이벤트를 처리한다. GameMode는 킬을 한 플레이어의 PlayerState에 접근하여 점수를 올린다.
  8. 상태 공유: 점수가 변경된 PlayerState는 모든 클라이언트로 복제된다. 또한, 팀 점수가 바뀌었다면 GameState의 팀 점수 프로퍼티가 업데이트되고 이 역시 모든 클라이언트로 복제된다.
  9. UI 업데이트: 각 클라이언트는 자신의 로컬 GameStatePlayerState들을 참조하여 HUD의 점수판을 최신 상태로 갱신한다.

4. 비교 요약표

클래스 핵심 역할 존재 위치 복제 여부 주요 데이터
GameMode 게임 규칙 (심판) 서버 전용 복제 안 됨 승리 조건, 스폰 규칙
GameState 게임 상태 (전광판) 서버 + 모든 클라이언트 모두에게 복제 게임 시간, 팀 점수, 플레이어 목록
PlayerController 플레이어 입력/제어 (두뇌) 서버 + 소유 클라이언트 소유자에게만 관련 입력 처리, 카메라, UI 상호작용
PlayerState 플레이어 상태 (명찰) 서버 + 모든 클라이언트 모두에게 복제 플레이어 이름, 개인 점수, 핑
Pawn 플레이어 표현 (아바타) 서버 + 모든 클라이언트 모두에게 복제 위치, 체력, 외형

5. 구술 면접 대비 요약

이 다섯 클래스는 멀티플레이어 게임의 구조를 잡는 핵심 요소입니다.

  • GameMode는 게임의 규칙을 정의하는 심판으로, 서버에만 존재합니다.
  • GameState는 GameMode가 관리하는 게임의 현재 상태(예: 남은 시간, 팀 점수)를 모든 플레이어에게 복제해주는 공용 전광판입니다.
  • PlayerController는 플레이어의 입력을 받아 Pawn을 조종하는 두뇌와 같은 역할을 하며, 서버와 해당 클라이언트에만 존재합니다.
  • PlayerState는 플레이어의 이름, 점수, 핑처럼 모든 사람이 알아야 할 개인 정보를 담아 모두에게 복제되는 명찰입니다.
  • Pawn은 게임 세계에 실제로 보여지는 플레이어의 아바타로, PlayerController의 조종을 받으며 모든 클라이언트에 복제됩니다.

간단히 말해, 서버의 GameMode가 규칙을 정하면, 그 결과로 변하는 게임 전체 상태는 GameState가, 플레이어 개별 상태는 PlayerState가 모든 클라이언트에게 공유합니다. 실제 조종은 PlayerController가 담당하고, 그 결과물은 Pawn으로 나타납니다. 이처럼 역할과 데이터 소유를 명확히 분리하여 복잡한 네트워크 게임을 효율적으로 관리할 수 있습니다.

'Unreal' 카테고리의 다른 글

std::map과 TMap  (0) 2025.10.29
UE5 ActorComponent와 SceneComponent  (0) 2025.10.28
Remote Procedure Call  (0) 2025.10.27
NetRole  (0) 2025.10.27
Replication Condition  (0) 2025.10.24
iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차