icon
3장 : 게임플레이 프로그래밍

Pawn, Character, Controller 이해


2장에서 언리얼 엔진의 핵심 객체 시스템과 게임 루프를 구성하는 주요 클래스들에 대해 깊이 있게 살펴보았습니다. 이제 그 지식을 바탕으로, 실제 게임플레이를 구현하는 데 가장 필수적인 세 가지 클래스인 APawn, ACharacter, 그리고 AController 에 대해 더욱 자세히 알아보겠습니다. 이 세 클래스는 언리얼 엔진에서 플레이어와 AI의 움직임, 상호작용, 그리고 그 제어를 담당하는 핵심적인 역할을 수행합니다.


APawn: 제어 가능한 월드 객체

APawn은 언리얼 엔진의 3D 월드에 존재하며 AController에 의해 빙의(Possess)되어 제어될 수 있는 AActor의 한 종류입니다. Pawn은 기본적으로 시각적인 표현이나 복잡한 이동 로직을 내장하고 있지 않습니다. 대신, AController로부터 명령을 받아 움직이거나 특정 행동을 수행하는 '대리인' 역할을 합니다.

  • 주요 특징

    • 제어 가능성: APlayerController 또는 AAIController에 의해 '빙의'될 수 있습니다. 빙의되지 않은 Pawn은 독립적으로 움직이지 않습니다.
    • 변환 정보: AActor를 상속받으므로 월드 내에서 위치, 회전, 스케일 정보를 가집니다.
    • 컴포넌트 컨테이너: APawn 자체는 아무런 시각적 메시나 이동 로직을 가지지 않지만, UPROPERTY로 선언된 컴포넌트들을 추가하여 기능을 확장할 수 있습니다. 예를 들어, UStaticMeshComponent를 추가하여 시각적인 형태를 부여하고, UFloatingPawnMovement 같은 컴포넌트를 붙여 이동 로직을 구현할 수 있습니다.
    • 입력 처리 위임: APawn은 직접 플레이어 입력을 처리하기보다는, 빙의된 AController로부터 명령을 받습니다. 하지만 필요하다면 APawn 자체적으로도 입력을 바인딩하고 처리할 수 있습니다.
  • 언제 APawn을 사용할까요?

    • 사람 형태가 아닌 플레이어블 객체: 예를 들어, 차량, 비행기, 드론, 탱크 등 복잡한 이동 로직이 필요 없는 이동체를 구현할 때 APawn을 상속받아 사용합니다.
    • 간단한 AI 객체: 단순한 움직임이나 상호작용만을 수행하는 AI 객체에 적합합니다.

ACharacter: 플레이어를 위한 특화된 Pawn

ACharacterAPawn을 상속받는 특별한 유형의 Pawn 클래스입니다. 이름에서 알 수 있듯이, ACharacter는 주로 사람 형태의 플레이어블 캐릭터나 AI 캐릭터를 구현하는 데 특화되어 있습니다. ACharacterAPawn의 모든 기능을 포함하며, 캐릭터의 움직임과 관련된 복잡한 로직을 손쉽게 구현할 수 있도록 몇 가지 강력한 내장 컴포넌트를 제공합니다.

  • 주요 특징

    • UCapsuleComponent (Root Component): ACharacter의 루트 컴포넌트로 자동으로 포함됩니다. 캐릭터의 충돌 영역을 캡슐 형태로 정의하며, 정확한 충돌 감지 및 물리 상호작용에 사용됩니다.
    • USkeletalMeshComponent: 캐릭터의 스켈레탈 메시(애니메이션 가능한 3D 모델)를 표현하는 컴포넌트입니다. 캐릭터의 시각적인 부분을 담당하며, 애니메이션 블루프린트와 연동되어 복잡한 애니메이션을 구현합니다.
    • UCharacterMovementComponent: ACharacter의 가장 핵심적인 컴포넌트입니다. 중력, 점프, 걷기, 달리기, 웅크리기, 공중 부양, 낙하 등 사람 형태의 캐릭터가 수행할 수 있는 모든 복잡한 이동 로직을 이미 구현해 놓았습니다. 이 컴포넌트의 설정을 조작하고 함수를 호출하는 것만으로 다양한 캐릭터 이동을 손쉽게 구현할 수 있습니다. 네트워크 멀티플레이어 환경에서도 완벽하게 동기화되도록 설계되어 있습니다.
    • 네트워크 복제 최적화: ACharacter는 네트워크 환경에서 이동 및 상태 복제에 최적화되어 있습니다.
  • 언제 ACharacter를 사용할까요?

    • 대부분의 플레이어블 캐릭터: FPS/TPS 게임의 주인공, RPG 게임의 캐릭터 등 사람 형태의 복잡한 움직임이 필요한 경우에 사용합니다.
    • 사람 형태의 AI 캐릭터: NPC, 몬스터 등 UCharacterMovementComponent의 이동 로직이 필요한 AI 캐릭터에 사용합니다.

AController: Pawn을 제어하는 두뇌

AControllerAPawn 또는 ACharacter를 '빙의'하여 제어하는 역할을 담당하는 클래스입니다. AController 자체는 월드에 시각적으로 존재하지 않으며, Pawn이나 Character가 '몸'이라면 Controller는 그 '몸'을 움직이는 '두뇌'에 해당합니다. AController는 두 가지 주요 파생 클래스로 나뉩니다.

APlayerController: 플레이어의 두뇌

  • 역할: 사용자(플레이어)의 입력(키보드, 마우스, 게임패드 등)을 받아 Pawn이나 Character를 제어하고, 게임 월드와 상호작용하는 역할을 합니다. 또한 플레이어의 HUD(Head-Up Display) 표시, 인벤토리 관리, 설정 저장/로드 등 플레이어 고유의 전반적인 관리도 담당합니다.

  • 특징

    • 각 플레이어마다 하나씩 존재: 멀티플레이어 게임에서는 접속한 각 플레이어마다 자신만의 APlayerController 인스턴스를 가집니다.
    • 서버와 클라이언트 모두에 존재: APlayerController는 서버와 해당 클라이언트 모두에 복제되어 존재하며, 입력 처리와 명령 전달을 담당합니다.
    • UI 상호작용: UI 위젯을 생성하고 관리하며, 마우스 커서 표시 등을 제어할 수 있습니다.
    • Possess()UnPossess() 함수: APlayerControllerPossess(APawn* InPawn) 함수를 통해 특정 Pawn에 빙의하여 제어를 시작하고, UnPossess()를 통해 제어를 해제할 수 있습니다.
  • 언제 APlayerController를 사용할까요?

    • 플레이어의 입력 처리 및 캐릭터 조작.
    • 플레이어 인벤토리, 스킬, 능력치 등 플레이어 고유의 데이터 관리.
    • 플레이어에게 보여지는 UI(HUD, 메뉴 등) 관리.
    • 클라이언트와 서버 간의 RPC(Remote Procedure Call) 통신 시작점.

AAIController: AI의 두뇌

  • 역할: AI(인공지능)의 로직을 처리하고, 해당 AI가 조종하는 Pawn이나 Character를 제어하는 클래스입니다. 플레이어가 아닌 컴퓨터가 제어하는 모든 Pawn 또는 CharacterAAIController에 의해 제어됩니다.

  • 특징

    • 행동 트리(Behavior Tree) 및 블랙보드(Blackboard) 연동: 언리얼 엔진의 강력한 AI 시스템인 행동 트리와 블랙보드를 사용하여 복잡한 AI 로직을 구축하는 데 핵심적인 역할을 합니다.
    • 지각 컴포넌트(Perception Component): UAIPerceptionComponent와 같은 컴포넌트를 사용하여 환경을 인지(시각, 청각 등)하고, 인지된 정보를 바탕으로 행동을 결정합니다.
    • 내비게이션(Navigation) 및 경로 탐색: 내비게이션 메시를 이용하여 캐릭터가 이동할 수 있는 경로를 탐색하고 이동 명령을 Pawn에게 전달합니다.
  • 언제 AAIController를 사용할까요?

    • 게임 내의 적, NPC, 아군 AI 등 컴퓨터가 제어하는 모든 캐릭터의 행동 로직을 구현할 때.

Pawn, Character, Controller의 관계 요약

이 세 클래스의 관계는 마치 '뇌(Controller)가 몸(Pawn/Character)을 움직인다' 는 비유로 설명할 수 있습니다.

  • Controller: '뇌'에 해당합니다. 입력(플레이어) 또는 AI 로직(AI)을 처리하고, '몸'에게 어떤 행동을 할지 명령합니다. Controller는 월드에 시각적으로 존재하지 않습니다.
  • Pawn / Character: '몸'에 해당합니다. Controller의 명령을 받아 3D 월드에서 움직이고 시각적으로 표현됩니다. Character는 Pawn의 특화된 형태로, 특히 사람 형태의 복잡한 움직임에 적합한 기능을 내장하고 있습니다.

하나의 Pawn은 동시에 하나의 Controller에 의해서만 빙의될 수 있습니다. ControllerPawnPossess()하고 UnPossess()함으로써 제어권을 얻거나 포기할 수 있습니다.


실제 게임에서의 예시

  • FPS 게임 플레이어
    • ACharacter: 플레이어가 직접 조종하는 캐릭터 (시각적인 모델, 움직임).
    • APlayerController: 마우스/키보드 입력을 받아 ACharacter를 움직이고 총을 발사하는 등 제어. HUD 표시.
  • NPC 적
    • ACharacter: 적 NPC의 시각적인 모델과 움직임.
    • AAIController: 플레이어를 추적하거나 공격하는 AI 로직을 수행하고, ACharacter에게 이동 및 공격 명령을 내림.
  • 차량 시뮬레이션
    • APawn: 차량의 물리 모델과 시각적인 메시.
    • APlayerController: 키보드/게임패드 입력을 받아 APawn (차량)을 조작.

이제 APawn, ACharacter, AController 이 세 가지 핵심 클래스의 역할과 차이점을 명확히 이해하셨을 것입니다. 이 지식은 언리얼 엔진에서 플레이어와 AI의 움직임을 구현하고 제어하는 데 있어 가장 기본적인 출발점이 됩니다.