The core object hierarchy — how Actors, Pawns, and Controllers relate, and the principle that pawns expose control without deciding how they are controlled.
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.
Actors go through a predictable sequence of events from creation to destruction:
| Event | When it fires |
|---|---|
PostInitializeComponents | After all components are initialized |
BeginPlay | When the game starts or the actor is spawned into an active world |
Tick | Every frame (if enabled) |
EndPlay | Before the actor is removed from the world |
BeginDestroy | Memory cleanup — do not use for gameplay logic |
BeginDestroy. By the time it fires, the actor's components may already be invalid. Use EndPlay for cleanup logic.
Actors are built from components. An Actor itself has no visual representation, collision, or movement — those come from the components attached to it:
USceneComponent — provides a transform (position, rotation, scale)UStaticMeshComponent — renders a meshUCapsuleComponent — provides collisionUCharacterMovementComponent — handles movement physicsThis component-based design means you compose behavior by attaching components, rather than inheriting it from deep class hierarchies.
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.
A Pawn's job is to:
MoveForward, Jump, etc.)ACharacter is the most commonly used Pawn subclass. It adds:
UCapsuleComponent for collisionUSkeletalMeshComponent for an animated character meshUCharacterMovementComponent with walk, run, jump, fall, and swim built inFor most player characters and humanoid enemies, derive from ACharacter. Use APawn directly for vehicles, turrets, or anything without humanoid movement.
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:
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.
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();
Keeping behavior in the Controller and physicality in the Pawn enables powerful patterns:
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