Skip to content

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 Owner and the cast after it can be None or 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 Controller on the pawn can return the PlayerController,
  • Get Controlled Pawn on the PlayerController can return that pawn.

For an AI pawn, possession usually means:

  • the AIController can run behavior, path following, and movement commands,
  • Get Controller on 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:

  1. You deliberately called Un Possess. The controller lets go of its current pawn, often to enter spectator mode or switch bodies.
  2. The controller possessed something else. A controller normally controls one pawn at a time, so switching vehicles or characters leaves the old pawn.
  3. The pawn is being destroyed. Death and respawn often destroy one pawn and assign the controller to a new one.
  4. 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::Possess and AController::UnPossess in Engine/Source/Runtime/Engine/Private/Controller.cpp; APawn::PossessedBy, APawn::UnPossessed, and APawn::SpawnDefaultController in Engine/Source/Runtime/Engine/Private/Pawn.cpp.