Player Start, Restart Player, and checkpoints¶
At a glance
Main objects: PlayerStart, GameModeBase, PlayerController, pawn -
Main node: Restart Player at Player Start on GameModeBase -
Blueprint returns: no value; execution continues after the request -
Runs where: GameMode exists on the server/authority, not on remote
clients - Official docs: Player Start Actor,
Restart Player at Player Start
The one-minute version¶
- A
PlayerStartis a placed actor that marks where a pawn can spawn and which direction it should face. - The player does not choose its own normal spawn point. GameMode's spawn flow chooses or receives a start spot, spawns/selects a pawn, and has the PlayerController possess it.
Restart Player at Player Starttries to spawn the controller's pawn at the given start actor's location.- In multiplayer, this is server-side GameMode work. Remote clients do not have the live GameMode instance.
- A checkpoint is usually an ID or chosen start spot, not a stored pawn reference. Save the checkpoint ID, then resolve it to a PlayerStart or transform when respawning.
- After respawn, UI, input mappings, camera, and component bindings may need to rebind to the new pawn.
The spawn chain¶
The useful mental model is:
GameMode
-> chooses PlayerStart or transform
-> spawns default pawn class
-> PlayerController possesses pawn
-> pawn/character begins gameplay
-> UI/input/animation bind to current pawn
The PlayerStart is not the player. It is a marker. It can be placed in a level, tagged, moved, or chosen by GameMode logic.
If a level has no PlayerStart, Unreal can fall back to spawning at world origin or another editor/play setting. If a PlayerStart shows BADsize, its capsule overlaps blocking geometry and is probably not a safe spawn point.
What Restart Player at Player Start does¶
The Blueprint node lives on GameModeBase:
Restart Player at Player Start
Target = GameModeBase
New Player = PlayerController
Start Spot = PlayerStart or other Actor
It asks GameMode to restart that controller using the supplied start actor's location/rotation.
pseudocode of the engine behavior - not engine source
function RestartPlayerAtPlayerStart(GameMode, Controller, StartSpot):
if Controller is None or StartSpot is None:
return
spawn transform = StartSpot transform adjusted by spawn rules
Pawn = spawn default pawn for Controller at spawn transform
if Pawn exists:
Controller.Possess(Pawn)
run restart hooks
The node does not return the new pawn in Blueprint. If you need it, ask the controller for its pawn after restart, or handle the relevant GameMode / controller / pawn events in your own project flow.
Checkpoints¶
A checkpoint is usually data plus a spawn rule:
CheckpointId = "CaveEntrance"
CheckpointTransform = optional fallback transform
Do not save a direct reference to the old PlayerStart or old pawn in SaveGame and expect it to survive travel/quitting. Save a plain ID, map name, or structured checkpoint data, then resolve it when the map is loaded.
Beginner-friendly shape:
Player overlaps BP_CheckpointVolume
-> CurrentCheckpointId = "CaveEntrance"
-> save CurrentCheckpointId in GameInstance/SaveGame
Player dies
-> GameMode reads CurrentCheckpointId
-> FindPlayerStart or lookup checkpoint actor for that ID
-> Restart Player at Player Start
For a small single-player map, the lookup can be a placed actor reference held by GameMode or a one-time setup search. For a larger game, build a clear checkpoint registry instead of searching the world every time the player dies.
What respawn does not fix by itself¶
Respawn replaces or reinitializes the pawn. It does not automatically repair every reference in your game.
After respawn, check:
- PlayerController possesses the new pawn;
- gameplay input mapping context is active on the local player;
- widgets point at the new character or health component;
- camera view target is back to the pawn if you used a death camera;
- old pawn references in managers/components are cleared;
- AI targets, overlap sets, and interactable references do not point at the dead pawn.
The PlayerController is the stable owner for many player-facing systems. If the UI is owned by the old pawn, death can take the UI's reference chain with it.
Multiplayer note¶
GameMode exists only on the server. That means:
- clients should not try to directly call GameMode respawn logic they do not have;
- client death input or restart requests usually go through a server RPC on an owned pawn/controller;
- the server validates the request and restarts the player;
- replicated possession/pawn state lets clients learn about the new pawn.
Checkpoint data that all clients need can live in GameState/PlayerState or replicated actor state depending on whether it is match-wide or player-specific. Local-only UI can still live in PlayerController/widgets, but it must rebind to the server-approved current pawn.
When it fails (and what failure does)¶
Restart Player at Player Start has no failure output pin.
Common causes:
- New Player is not a valid Controller. GameMode has no controller to restart.
- Start Spot is
Noneor blocked. The spawn transform cannot be chosen or the pawn cannot fit. - Default Pawn Class is wrong or empty. GameMode cannot spawn the pawn you expected.
- Wrong GameMode is active. Project settings, map override, URL option, or prefix rules selected another GameMode.
- You are running on a client. Remote clients do not own the live GameMode.
- PIE start option fooled you. Play From Here / spawn-at-camera can ignore the placed PlayerStart during editor testing.
Failure can look like no new pawn, pawn at the wrong start, pawn at origin, old UI still showing dead data, or a log warning during spawn. Use prints on GameMode, PlayerController, Default Pawn Class, chosen StartSpot, and final possessed pawn.
The pattern everyone actually uses¶
Single-player checkpoint respawn:
BP_CheckpointVolume BeginOverlap
-> filter player character
-> GameInstance.CurrentCheckpointId = "CaveEntrance"
-> SaveGame.CurrentCheckpointId = "CaveEntrance"
-> Save Game to Slot if durable
Player health reaches 0
-> disable input/collision
-> optional Set View Target with Blend to death camera
-> GameMode RestartFromCheckpoint(PlayerController)
GameMode RestartFromCheckpoint:
-> FindPlayerStart with checkpoint ID or lookup checkpoint actor
-> Restart Player at Player Start
After restart:
PlayerController OnPossess / project event
-> ensure Add Mapping Context on local player
-> set camera back to pawn
-> tell HUD/widget to bind to new HealthComponent
Lookalikes - which one do I want?¶
| Tool | Use when | Watch out |
|---|---|---|
| PlayerStart | A level marker for player spawn/restart. | It is not the pawn and does not own respawn logic. |
| Restart Player | Let GameMode choose a start spot. | Good default when checkpoint choice is not custom. |
| Restart Player at Player Start | You already chose the start actor. | No Blueprint return value for the new pawn. |
| Restart Player at Transform | You have a transform instead of a start actor. | You own collision/safety of that transform. |
| Spawn Actor from Class + Possess | Custom pawn creation flow. | You must reproduce the framework work GameMode normally handles. |
| Open Level | Restart the whole map/world. | Destroys world actors instead of just replacing the pawn. |
| Set Actor Transform | Move an existing pawn to a checkpoint. | Does not reset pawn state, components, controller state, or death flags. |
Rule of thumb: GameMode chooses/restarts, PlayerStart marks where, Controller keeps the player identity, Pawn is the replaceable body.
Going deeper¶
- GameMode & friends, single-player edition
- default pawn/controller setup and map overrides.
- Possession - how a controller takes over a pawn.
- Destroy Actor / Set Life Span - old pawn cleanup.
- Set View Target with Blend - death cameras without changing possession.
- Add Mapping Context - input setup after pawn/controller changes.
- Blueprint variables and references
- save checkpoint IDs, not old actor references.
- Official docs: Player Start Actor, Restart Player at Player Start, Game Mode and Game State, and AGameModeBase.
- Engine source (requires engine access - we do not reproduce it here):
AGameModeBase::RestartPlayer,AGameModeBase::RestartPlayerAtPlayerStart,AGameModeBase::RestartPlayerAtTransform,AGameModeBase::FindPlayerStart,AGameModeBase::ChoosePlayerStart, andAGameModeBase::SpawnDefaultPawnAtTransforminEngine/Source/Runtime/Engine/Private/GameModeBase.cpp; PlayerStart declarations inEngine/Source/Runtime/Engine/Classes/GameFramework/PlayerStart.h.