Chapter 03

Gameplay Framework: Actors, Pawns & Controllers

The core object hierarchy — how Actors, Pawns, and Controllers relate, and the principle that pawns expose control without deciding how they are controlled.

In this chapter

  1. AActor — The Base of Everything
  2. APawn — The Controllable Actor
  3. AController — The Decision Maker
  4. Possession & the Separation of Concerns
1

AActor — The Base of Everything

AActor is the base class for any object that can be placed in or spawned into an Unreal level. If it exists in the world, it is (or derives from) an Actor.

Actor Lifecycle

Actors go through a predictable sequence of events from creation to destruction:

EventWhen it fires
PostInitializeComponentsAfter all components are initialized
BeginPlayWhen the game starts or the actor is spawned into an active world
TickEvery frame (if enabled)
EndPlayBefore the actor is removed from the world
BeginDestroyMemory cleanup — do not use for gameplay logic
Do not put gameplay logic in BeginDestroy. By the time it fires, the actor's components may already be invalid. Use EndPlay for cleanup logic.

Components

Actors are built from components. An Actor itself has no visual representation, collision, or movement — those come from the components attached to it:

This component-based design means you compose behavior by attaching components, rather than inheriting it from deep class hierarchies.


2

APawn — The Controllable Actor

APawn is an Actor that can be possessed by a Controller. This is the critical distinction: any Actor can exist in the world, but only a Pawn can be driven by a Controller.

Pawns do not decide how they are controlled. They only expose the ability to be controlled. That separation is the entire point.

A Pawn's job is to:

ACharacter

ACharacter is the most commonly used Pawn subclass. It adds:

For most player characters and humanoid enemies, derive from ACharacter. Use APawn directly for vehicles, turrets, or anything without humanoid movement.


3

AController — The Decision Maker

A AController is a non-physical actor that possesses a Pawn and drives its behavior. The Controller is the "brain"; the Pawn is the "body."

There are two Controller types:

APlayerController
  • Translates hardware input into Pawn actions
  • Manages the camera, HUD, and UI
  • Persists between level transitions
  • One per human player
AAIController
  • Drives a Pawn using AI logic
  • Runs Behavior Trees and EQS queries
  • Has a Blackboard for shared state
  • One per AI-controlled Pawn

Because the Controller is separate from the Pawn, you can swap the "brain" without changing the "body." The same ACharacter subclass can be possessed by a APlayerController in single-player, by a APlayerController replicated from a client in multiplayer, or by an AAIController when the player is dead and the game needs to take over.


4

Possession & the Separation of Concerns

The relationship between Controllers and Pawns is formalized through possession. When a Controller possesses a Pawn, it gains authority over its input and movement. When it unpossesses, the Pawn stops receiving input.

// Possessing a pawn from a Controller
AController* MyController = ...;
APawn* MyPawn = ...;
MyController->Possess(MyPawn);

// Unpossessing — Pawn still exists but receives no input
MyController->UnPossess();

Why this separation matters

Keeping behavior in the Controller and physicality in the Pawn enables powerful patterns:

A good rule of thumb: if logic depends on who is controlling the Pawn, it belongs in the Controller. If it's about the physical body in the world, it belongs in the Pawn.

The full hierarchy at a glance

UObject
└── AActor
    ├── AInfo
    │   ├── AGameMode        ← Rules of the game
    │   ├── AGameState       ← Shared game state
    │   └── APlayerState     ← Per-player state (score, name)
    ├── AController
    │   ├── APlayerController
    │   └── AAIController
    └── APawn
        └── ACharacter       ← Humanoid pawn with movement built in
← Chapter 2 ↑ Index