Contents
Unreal Engine 5.8 · System guide
Blueprint Architecture
Structure scalable Blueprint gameplay systems
On this page
Choose a task
Choose an approach
Build and understand
Troubleshoot
Workflow and boundaries
Use these checks when a task crosses several systems. The focused references above contain the specific actions.
Select the owner and lifetime
Read references/system-selector.md before choosing a
class. Put behavior on the object with the shortest correct lifetime and clear ownership.
- Use an Actor for an independently placed, spawned, replicated, or transformed entity.
- Use an Actor Component for a reusable capability owned by an Actor.
- Use a GameInstance Subsystem for one service spanning maps in one game instance.
- Use a LocalPlayer Subsystem for per-local-player services and split-screen isolation.
- Use a World Subsystem for one service per World.
- Use a Data Asset for authored definitions; keep mutable runtime state elsewhere.
- Use a Blueprint Function Library only for stateless operations.
Select communication
Read references/communication-patterns.md.
- Use a direct reference for a stable one-to-one relationship.
- Use a Blueprint Interface when the caller has a target but should not depend on its concrete class.
- Use an Event Dispatcher when one known publisher notifies zero or more listeners.
- Use a subsystem/message router for many-to-many, cross-system events with deliberate scope and debugging.
- Do not replace clear one-to-one calls with global messaging.
Execute
- State ownership, lifetime, authority, and save/replication requirements.
- Draw dependency direction before adding references.
- Keep reusable capability logic in components; access owners through interfaces where concrete casts would defeat reuse.
- Keep Blueprint graphs event-driven. Replace repeated Tick work with events, timers, or invalidation unless continuous per-frame evaluation is required.
- Keep Construction Script idempotent and editor-safe. Put runtime mutation in explicit runtime functions.
- Move stable contracts, high-frequency work, networking foundations, and merge-heavy shared systems to C++; expose deliberate Blueprint-facing APIs.
- Test lifecycle, duplicate binding, teardown, map travel, respawn, multiplayer authority, and packaged behavior.
Read references/use-cases.md for concrete layouts and
references/lifecycle-performance.md for execution
boundaries. Use references/troubleshooting.md when a
system becomes coupled, fires twice, retains stale references, or behaves differently in
the editor and runtime.
Hard rules
- Avoid gameplay logic in Level Blueprints unless it truly belongs to that level.
- Never use
Get All Actors of Classas routine dependency injection. - Never bind a delegate repeatedly without a matching unbind or one-time guard.
- Never store mutable session state in a Data Asset or class default object.
- Treat Interfaces as contracts, not object discovery; a target reference is still needed.
- Treat Event Dispatchers as publisher-owned signals, not global message buses.
- Profile before moving Blueprint code to C++, but keep per-frame loops and complex math under suspicion.
See references/sources.md for the UE 5.8 source trail.
Version and evidence
Targets Unreal Engine 5.8 documentation. This label does not establish that every procedure was tested in an editor or packaged build.
Read the documentation sources and verification notes →