Possession¶
The Controller is the brain. The Pawn is the body. Possession is the link between them.
The one-minute version¶
- A Controller possesses a Pawn. The controller decides; the pawn is the thing being driven.
- A PlayerController represents a human player. An AIController represents an artificial intelligence brain.
- A Pawn is controllable. A Character is a Pawn with the usual walking character pieces already included.
- If a pawn is unpossessed, it has no controller. Player input and AI orders stop affecting it until some controller possesses it again.
- In multiplayer, possession is decided by the authority, usually the server. A client cannot make the server accept a new possessed pawn just by running a local Blueprint node.
- The Animation Blueprint editor preview is not your live, possessed game
pawn. That is why
Try Get Pawn Ownerand the cast after it can beNoneor fail in preview while working in play-in-editor.
The relationship¶
flowchart LR
Human[Human player] --> PC[PlayerController]
Bot[AI decision logic] --> AI[AIController]
PC -- possesses --> PawnA[Pawn or Character]
AI -- possesses --> PawnB[NPC Pawn or Character]
PawnA -- owns component --> Mesh[SkeletalMeshComponent]
Mesh -- runs --> Anim[Animation Blueprint / Anim Instance]
The Controller is not the mesh, capsule, camera, or visible body. It is an Actor whose job is to drive a pawn. That split is why a player can die, lose a body, respawn into a new body, and still be the same connected player.
The Pawn is the body in the world. It has a transform, collision, components, and movement behavior. A Character is the common humanoid Pawn subclass: it adds a capsule, skeletal mesh, and Character Movement Component.
Possession is the active control link:
pseudocode of the gameplay relationship - not engine source
Controller.Possess(Pawn):
if this controller already has a pawn:
unpossess the old pawn
controller's current pawn = Pawn
pawn's current controller = Controller
notify the pawn and controller that the link changed
In normal single-player, this feels automatic because the GameMode spawns or selects a default pawn and assigns the player's PlayerController to it. When that automatic setup is missing, your character can exist in the level but not receive player input.
What possession changes¶
Possession changes who is allowed to drive the pawn.
For a player pawn, that usually means:
- movement input from the PlayerController reaches the pawn,
- camera/control rotation starts coming from that controller,
Get Controlleron the pawn can return the PlayerController,Get Controlled Pawnon the PlayerController can return that pawn.
For an AI pawn, possession usually means:
- the AIController can run behavior, path following, and movement commands,
Get Controlleron the pawn can return the AIController,- AI-specific setup in the pawn's possessed events can run.
Possession does not mean the controller owns the pawn in every Unreal sense. Unreal also has component ownership, actor network ownership, and UObject Outer/lifetime. Those are separate relationships; see Ownership and lifetime for the full decoder.
When a pawn is unpossessed¶
Unpossessed means "no controller is currently driving this pawn."
Common causes:
- You deliberately called Un Possess. The controller lets go of its current pawn, often to enter spectator mode or switch bodies.
- The controller possessed something else. A controller normally controls one pawn at a time, so switching vehicles or characters leaves the old pawn.
- The pawn is being destroyed. Death and respawn often destroy one pawn and assign the controller to a new one.
- Auto-possession never happened. A placed pawn with the wrong Auto Possess Player setting, a missing GameMode default pawn, or an AI pawn without an AIController class can sit in the world with no controller.
What failure looks like depends on the graph. Get Controller can return
None; movement input may do nothing; AI Move To may fail because there is no
AIController; input events may fire on the PlayerController but never affect the
body you are looking at.
No hidden recovery happens. If a pawn should be controlled, some setup path must possess it: GameMode default spawn, Auto Possess Player, Auto Possess AI, Spawn Default Controller, or an explicit Possess call in the right authority context.
Why this matters in Animation Blueprints¶
An Animation Blueprint does not possess anything. It animates a skeletal mesh. From inside the AnimBP, your common chain is:
Try Get Pawn Owner -> Cast To BP_YourCharacter -> cache the character ->
read movement values for the state machine.
That first node is about the mesh's owning actor, not the controller. If the
mesh belongs to your live Character, Try Get Pawn Owner can return that
Character even before you ask who controls it.
The editor preview is different. The preview viewport is not running your
GameMode, spawning your player, and possessing your runtime Character. It is an
editor preview scene with an editor-owned preview object. So the AnimBP graph
can see Try Get Pawn Owner return None, followed by a failed cast, while the
same graph works when you press Play.
That preview failure is a signal to guard your graph, not to panic:
Try Get Pawn Owner -> Cast To BP_YourCharacter -> store variable if cast
succeeds -> later Is Valid before reading it.
Multiplayer rule of thumb¶
For beginner single-player, "the PlayerController possesses my Character" is usually enough.
For multiplayer, add one rule: the server decides possession. The Blueprint
Possess call is authority-only. If a client wants to switch pawn, it asks the
server through an allowed server event; the server performs the possession; the
result replicates back.
Do not build client-only possession logic and expect it to control the real networked game. It may appear to work for a moment locally, then disagree with the server.
Lookalikes - which relationship do I mean?¶
| Phrase or node | Relationship | Use when |
|---|---|---|
| Possession | Controller drives Pawn | You are asking who receives input or AI commands. |
| Get Controller | Pawn -> current Controller, or None |
A pawn needs to know who is driving it. |
| Get Controlled Pawn | Controller -> current Pawn, or None |
A controller needs the body it currently drives. |
| Try Get Pawn Owner | Anim Instance -> mesh owner, if that owner is a Pawn | You are inside an Animation Blueprint and need the pawn being animated. |
| Actor Owner | Actor -> optional network owner actor | You are asking about networking permission or relevancy. |
| Component owner | Component -> Actor that contains it | You are asking what actor a component belongs to. |
Going deeper¶
- The gameplay class hierarchy - why every Character is a Pawn, and why not every Pawn is a Character.
- Ownership and lifetime - the other Unreal relationships that use the word "owner."
- Try Get Pawn Owner - the Animation Blueprint node that started this wiki.
- Cast To X and Is Valid - the guards that make possession timing safe in beginner Blueprints.
- Official docs: Controllers, AController::Possess, APawn, and EAutoPossessAI.
- Engine source (requires engine access - we do not reproduce it here):
AController::PossessandAController::UnPossessinEngine/Source/Runtime/Engine/Private/Controller.cpp;APawn::PossessedBy,APawn::UnPossessed, andAPawn::SpawnDefaultControllerinEngine/Source/Runtime/Engine/Private/Pawn.cpp.