Recommendation
Choose the narrowest lifetime that owns the service: Engine, Editor, Game Instance, World, or Local Player.
Compare the options
Engine Subsystem
Choose when
- One runtime service must span every world in the process.
- The state belongs to the engine process rather than one game session.
Tradeoffs
- State outlives individual worlds and Game Instances.
- World references can become stale if retained carelessly.
- Blueprint
- Use Get Engine Subsystem.
- C++
- Derive from UEngineSubsystem and use GEngine->GetEngineSubsystem<T>().
Editor Subsystem
Choose when
- An editor-only tool or service follows the editor process.
- The API must not exist in a packaged game.
Tradeoffs
- The type belongs in editor-only code.
- Runtime modules cannot depend on it.
- Blueprint
- Use the Editor Subsystem access nodes in editor scripting.
- C++
- Derive from UEditorSubsystem and use GEditor->GetEditorSubsystem<T>().
Game Instance Subsystem
Choose when
- State spans map loads in one running game.
- The service belongs to the game session on this machine.
Tradeoffs
- The state does not replicate automatically.
- It resets when the Game Instance shuts down.
- Blueprint
- Use Get Game Instance Subsystem.
- C++
- Derive from UGameInstanceSubsystem and call GameInstance->GetSubsystem<T>().
World Subsystem
Choose when
- State belongs to one UWorld.
- The service should reset when that world is destroyed.
Tradeoffs
- PIE and editor sessions can contain more than one World.
- The service does not survive map travel.
- Blueprint
- Use Get World Subsystem.
- C++
- Derive from UWorldSubsystem and call World->GetSubsystem<T>().
Local Player Subsystem
Choose when
- Each local player needs separate state.
- Split-screen players must not share the service instance.
Tradeoffs
- The lifetime follows one ULocalPlayer.
- Dedicated servers have no local players.
- Blueprint
- Use Get Local Player Subsystem.
- C++
- Derive from ULocalPlayerSubsystem and call LocalPlayer->GetSubsystem<T>().
Requirements
Runtime Subsystems are part of Engine. Editor Subsystems must stay behind editor-only module boundaries.
Example
Use a World Subsystem for a map target registry and a Local Player Subsystem for each split-screen player UI state.