본문으로 건너뛰기

안동민 개발노트

본문 시작

Pawn, Character, Controller 이해

Controller가 Pawn을 Possess하는 흐름과 Character의 이동·충돌·애니메이션 확장 구조를 구분합니다.

2장에서 객체 시스템과 게임 루프의 큰 틀을 잡았다면, 이제 실제 게임플레이의 중심 클래스로 내려와야 합니다.

이번 절에서는 APawn, ACharacter, AController를 제어 주체와 몸체 책임 기준으로 다룹니다.

이 세 클래스는 플레이어와 AI의 움직임, 상호작용, 제어 책임을 나누는 핵심 기준입니다.

핵심 관계 흐름: AControllerPawnPossess()해 제어하고, ACharacterPawn을 확장해 이동/충돌/애니메이션 기능을 제공합니다.

Controller는 의지, Pawn은 몸, Character는 사람형 이동 패키지다

제어 주체와 월드 표현을 분리하면 같은 Controller가 죽거나 교체된 Pawn을 다시 빙의할 수 있다.

  1. Human / AI

    입력 또는 행동 판단을 만든다.

  2. APlayerController / AAIController

    ControlRotation과 제어 로직을 소유한다.

  3. APawn 또는 ACharacter

    월드에서 이동·충돌·상호작용을 수행한다.

  4. AController

    비물리 제어 주체. Possess() 와 UnPossess() 로 현재 Pawn을 바꾼다.

  5. APawn

    제어 가능한 Actor. 차량·드론·포탑처럼 이동 구조를 직접 설계할 때 출발점이다.

  6. ACharacter

    APawn의 특화형. Capsule, Mesh, CharacterMovement와 네트워크 이동 지원을 묶는다.

  7. Character

    걷기·점프·낙하·수영과 예측/보정이 필요한 세로형 캐릭터.

  8. Pawn

    바퀴·비행·고정 포탑처럼 CharacterMovement 모델과 다른 몸체.

  9. Authority

    네트워크에서 Possess() 는 권한 측에서 실행하고 변경을 복제한다.


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 클래스입니다.

사람 형태의 플레이어 캐릭터나 AI 캐릭터 구현에 맞춰 설계되어 있으며, APawn 기능 위에 이동/충돌/애니메이션 연동에 필요한 기본 컴포넌트를 제공합니다.

  • 주요 특징
    • UCapsuleComponent (Root Component): ACharacter의 루트 컴포넌트로 자동으로 포함됩니다. 캐릭터의 충돌 영역을 캡슐 형태로 정의하며, 정확한 충돌 감지 및 물리 상호작용에 사용됩니다.

    • USkeletalMeshComponent: 캐릭터의 스켈레탈 메시(애니메이션 가능한 3D 모델)를 표현하는 컴포넌트입니다. 캐릭터의 시각적인 부분을 담당하며, 애니메이션 블루프린트와 연동되어 복잡한 애니메이션을 구현합니다.

    • UCharacterMovementComponent: ACharacter의 핵심 컴포넌트입니다. 중력, 점프, 걷기, 달리기, 웅크리기, 낙하 같은 이동 로직을 기본 구현하고 있어 설정 조정과 함수 호출만으로 다양한 움직임을 만들 수 있습니다.

      네트워크 멀티플레이어 동기화까지 고려되어 있다는 점도 큰 장점입니다.

    • 네트워크 복제 최적화: ACharacter는 네트워크 환경에서 이동 및 상태 복제에 최적화되어 있습니다.

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

AController: Pawn을 제어하는 두뇌

AControllerAPawn 또는 ACharacter를 빙의(Possess)해 제어하는 클래스입니다.

AController 자체는 월드에 보이지 않으며, Pawn/Character가 몸이라면 Controller는 그 몸을 움직이는 두뇌 역할을 합니다.

이 클래스는 크게 두 가지 파생 타입으로 나뉩니다.

빙의 흐름을 수명 주기로 보면 Controller는 의사결정과 입력을 들고 있고, Pawn은 월드 위치와 충돌, 이동 컴포넌트를 들고 있는 구조가 더 선명해집니다.

Controller의 판단은 남고 Possess가 실행할 Pawn만 교체한다

입력·AI 판단과 월드의 위치·충돌·이동을 분리하면 리스폰, 탑승, 관전에서 어떤 객체가 유지되는지 선명해진다.

  1. Controller

    Player 입력이나 AI 판단을 행동 명령으로 바꾼다.

  2. Possess

    Controller와 현재 Pawn의 양방향 참조를 연결한다.

  3. Pawn

    위치, 충돌, 메시, Movement를 사용해 월드 행동을 실행한다.

  4. UnPossess

    기존 몸과 연결을 끊되 Controller의 판단 상태는 유지한다.

  5. Switch

    리스폰·탑승·관전 대상인 새 Pawn을 다시 Possess한다.

  6. Controller에 남음

    입력 해석, AI 판단, 관점과 플레이어 세션.

  7. Pawn과 교체됨

    월드 위치, 충돌, 이동 모델과 시각 표현.

  8. 디버깅 시작점

    GetPawn() 과 GetController() 참조를 먼저 대조한다.

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의 관계 요약

다음 다이어그램은 Pawn, Character, Controller의 리플렉션 경계, 객체 수명, 엔진 호출을 요약합니다.

Controller는 결정을 내리고 Pawn 계열은 월드에서 움직인다

입력 판단, 소유, 이동 구현을 나누면 플레이어와 AI를 같은 구조로 다룰 수 있다.

역할담당 객체책임 경계
DecisionPlayerController / AIController입력이나 AI 판단으로 명령을 만든다
PossessController와 Pawn 연결어느 몸체가 명령을 받을지 정한다
BodyAPawn조종 가능한 몸체의 최소 단위
MovementACharacter / MovementComponent보행, 점프, 충돌, 애니메이션 변화

이 세 클래스의 관계는 Controller가 의사결정과 입력을 들고, Pawn/Character가 월드 표현과 이동을 맡는 구조로 읽으면 됩니다.

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

하나의 Pawn은 동시에 하나의 Controller에 의해서만 빙의될 수 있습니다.

ControllerPawnPossess()하고 UnPossess()함으로써 제어권을 얻거나 포기할 수 있습니다.

아래 의사결정 다이어그램은 제어 주체(플레이어/AI)와 이동 요구사항(사람형 이동/네트워크 보정 여부)에 따라 ControllerPawn 타입을 고르는 기준을 한 번에 정리합니다.

핵심 체크포인트: 사람형 이동, 점프, 복제 보정이 필요하면 ACharacter를 우선 검토하고, 단순 이동체라면 APawn + 전용 이동 컴포넌트 구성을 먼저 고려합니다.

Controller와 Pawn 계열은 제어 주체와 이동 모델로 고른다

누가 조종하는지 먼저 정하고, 몸체가 사람형 이동을 필요로 하는지 판단하면 선택이 단순해진다.

질문선택이유
플레이어 입력이 중심인가PlayerController로컬 입력, HUD, 클라이언트 RPC 시작점
AI 판단이 중심인가AIControllerBehavior Tree, Blackboard, NavMesh 판단 주체
사람형 이동이 필요한가ACharacterCapsule, Skeletal Mesh, 점프와 보행 보정
고유 이동 모델인가APawn차량, 드론, 포탑처럼 직접 조립할 몸체

실제 클래스를 나눌 때는 입력, 의사결정, 월드 표현, 이동 컴포넌트가 어느 클래스의 책임인지 먼저 고정하면 구조가 덜 흔들립니다.

명령, 몸, 이동 규칙을 다른 클래스에 둔다

Controller는 제어 의도를 만들고, Pawn은 월드에 존재하는 몸을 가지며, Character는 사람형 이동과 충돌 규칙을 기본 제공하는 Pawn입니다.

  1. APlayerController

    Player 입력, 카메라 의도, 로컬 UI, 서버 RPC 시작점을 들고 플레이어 연결과 함께 유지됩니다.

  2. APawn

    Body 월드에 배치되는 몸입니다. 차량, 드론, 포탑처럼 직접 이동 규칙을 설계할 때 적합합니다.

  3. ACharacter

    Move 캡슐, 스켈레탈 메시, CharacterMovement가 필요하면 기본 구현을 활용합니다.

  4. AAIController

    AI 행동 트리, 블랙보드, 내비게이션 요청처럼 보이지 않는 판단 흐름을 맡깁니다.

  5. 리스폰

    Pawn이 사라져도 점수, 입력 설정, 메뉴 상태는 PlayerController나 PlayerState에 남깁니다.

  6. 탑승 전환

    같은 Controller가 캐릭터 Pawn을 내려놓고 차량 Pawn을 Possess하면 입력 주체는 유지됩니다.

  7. AI 교체

    Pawn의 메시와 충돌은 유지하면서 Controller만 바꾸면 다른 의사결정을 붙일 수 있습니다.


실제 게임에서의 예시

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

APawn, ACharacter, AController의 기준은 입력 주체와 몸체 책임을 분리하는 것입니다.

이 구분은 플레이어와 AI의 움직임을 구현할 때 기본 설계선이 됩니다.

빙의가 바뀌어도 유지할 책임과 Pawn 쪽에 남길 책임을 마지막으로 분리합니다.

Pawn, Character, Controller는 조종 대상과 입력 주체가 다르다

움직이는 객체와 결정을 내리는 객체를 분리하면 입력 코드와 이동 코드가 섞이지 않는다.

개념정의확인할 기준
Pawn빙의 가능한 최소 몸체이며 이동 방식은 직접 설계한다차량, 드론, 조립형 오브젝트
CharacterCharacterMovementComponent와 Capsule을 가진 Pawn사람형 보행과 점프
Controller플레이어 입력이나 AI 판단을 Pawn에 전달한다입력, 카메라, 의사결정
PossessController가 어느 Pawn을 소유하는지 정한다입력 전달 대상과 카메라 흐름