Files
UE5-Modular-Game-Framework/docs/developer/architecture-overview.md
Lefteris Notas 8bc731e5ae feat: Add multiplayer networking architecture and documentation updates
- Updated Master Blueprint Index to include Multiplayer Networking support.
- Added detailed Multiplayer Networking sections across all developer documentation (01-11).
- Introduced authority maps, key patterns, and RPC guidelines for each system.
- Established a comprehensive multiplayer networking architecture document outlining core principles, replication strategies, and anti-cheat considerations.
- Enhanced UI documentation to clarify local-only behavior and binding to replicated dispatchers.
- Implemented client prediction strategies and RPC naming conventions for consistency across the framework.
2026-05-19 17:15:57 +03:00

12 KiB

Architecture Overview — UE5 Modular Game Framework

Purpose: A high-level walkthrough of the entire framework architecture — the big picture before diving into individual system docs. Read this first if you're new to the framework.


The Core Idea

This framework provides a complete, modular, Blueprint-only game architecture for Unreal Engine 5.5-5.7 built on 14 architectural principles. Every system is a self-contained Blueprint Component or Actor that communicates through interfaces, event dispatchers, and GameplayTags — never through direct hard references unless they're tightly coupled by design.

The Four Communication Methods

TIGHTLY COUPLED         │         LOOSELY COUPLED
(use sparingly)         │         (preferred)
                        │
Direct Reference        │    Interface Calls
  GM → GS_CoreGameState │      I_Interactable, I_Damageable
  Player → Components   │      Caller knows interface, not class
                        │
                        │    Event Dispatchers
                        │      OnHealthChanged, OnDeath
                        │      Fire-and-forget, one-to-many
                        │
                        │    GameplayTag + Subsystem Lookup
                        │      GI_GameFramework.GetSubsystem(Tag)
                        │      Fully decoupled, globally accessible

System Layers (Bottom-Up)

┌────────────────────────────────────────────────────────────────┐
│  LAYER 8: POLISH & META                                         │
│  Tutorials, Loading, Credits, Analytics, Achievements           │
├────────────────────────────────────────────────────────────────┤
│  LAYER 7: ADAPTIVE                                              │
│  Difficulty, Atmosphere, Pacing, Scares, Audio (MetaSounds)     │
├────────────────────────────────────────────────────────────────┤
│  LAYER 6: AI                                                    │
│  Enemy Behavior, Perception, Memory, Patrol, Combat             │
├────────────────────────────────────────────────────────────────┤
│  LAYER 5: COMBAT                                                │
│  Weapons, Damage, Ammo, Recoil, Reload, Melee, Defense          │
├────────────────────────────────────────────────────────────────┤
│  LAYER 4: NARRATIVE & UI                                        │
│  Dialogue, Objectives, Cutscenes, HUD, Menus, Inventory UI      │
├────────────────────────────────────────────────────────────────┤
│  LAYER 3: INTERACTION & INVENTORY                               │
│  Doors, Puzzles, Pickups, Inventory, Containers, Equipment      │
├────────────────────────────────────────────────────────────────┤
│  LAYER 2: PLAYER SIMULATION                                     │
│  Health, Stamina, Stress, Movement, Hiding, Camera, Body        │
├────────────────────────────────────────────────────────────────┤
│  LAYER 1: FOUNDATION                                            │
│  GameInstance, GameMode, GameState, Interfaces, Tags, Items     │
└────────────────────────────────────────────────────────────────┘

Higher layers depend on lower layers. Foundation has no dependencies. Polish/Meta can observe everything.


Key Architectural Decisions

1. Central State Authority (BPC_StateManager)

Instead of System A checking "is System B in state X?", all systems query BPC_StateManager.IsActionPermitted(Tag). The StateManager maintains 42 exclusive action states and 18 overlay states. Gating rules are in DA_StateGatingTable — designers modify rules without touching Blueprints.

2. Interface-First Communication

All cross-system communication uses Blueprint Interfaces (I_Interactable, I_Damageable, I_Persistable, etc.). The caller queries "does this actor implement this interface?" and calls the interface function — never casts to a concrete class.

3. Data-Driven Everything

No hardcoded values. Every configuration lives in Data Assets (DA_ItemData, DA_EquipmentConfig, DA_AtmosphereProfile). Designers edit Data Assets in the Content Browser; Blueprints read from them at runtime.

4. UI Reads, Never Writes

Widgets display data from gameplay systems but never own game state. They bind to event dispatchers (OnHealthChanged → update health bar) and call functions (UseItem()) — but never store authoritative data.

5. GameplayTags for State, Not Booleans

No bIsDead, bIsHidden, bIsInCombat booleans. Everything is a GameplayTag compared via HasTag() / MatchesTag(). Tags are documented in GI_GameTagRegistry.

6. Single Audio Entry Point (SS_AudioManager)

Never call UGameplayStatics::PlaySound* directly. All audio routes through SS_AudioManager which manages 4 MetaSound buses (SFX, Ambience, Music, Dialogue → Master Bus). Room acoustics switch automatically via BP_RoomAudioZone triggers.

7. Enhanced Input Manager

All input goes through SS_EnhancedInputManager. Context switching uses priority-based stack. Key rebinding is platform-aware via DA_InputMappingProfile.

8. Force Stack for State Overrides

Death, cutscenes, void space push state onto a stack. RestorePreviousState() pops back — the player returns to exactly their previous state after a forced interruption.


Data Flow: A Typical Interaction

Player looks at a locked door
  → BPC_InteractionDetector sphere trace hits BP_DoorActor
  → Detector checks: I_Interactable? ✓ Priority? High ✓ Distance? 150cm ✓
  → Dispatches OnTargetFound → WBP_InteractionPromptDisplay shows "Locked Door [E]"

Player presses E
  → Detector calls I_Interactable.ExecuteInteraction on door
  → BP_DoorActor.Interact_Implementation:
     → CurrentState = Locked
     → TryUnlockWithItem() queries BPC_InventorySystem.HasItem(RequiredKeyTag)
     → Player has key? Yes → RemoveItemOnUse = true → consume key
     → UnlockDoor() → Play unlock sound via SS_AudioManager
     → TryOpen() → Set state Opening → Play open animation
     → OnOpenComplete → Set state Open → Broadcast OnDoorOpened
  → AI Perception hears door sound → BPC_AlertSystem becomes Suspicious
  → BPC_PersistentWorldStateRecorder logs door state change for save
  → WBP_NotificationToast shows "Door Unlocked"

All this happens through interfaces, dispatchers, and the audio subsystem — no system directly references another's concrete class.


Build-Order Rationale

The 16 build phases follow dependency order:

  1. Foundation + Input (01-core, 15-input) — zero dependencies, everything else builds on these
  2. Player Core (02-player) — depends on foundation
  3. Interaction (03-interaction) — depends on player + foundation
  4. Inventory (04-inventory) — depends on interaction + player
  5. Save/Load (05-saveload) — depends on inventory + player + interaction
  6. UI (06-ui) — depends on everything below
  7. Narrative (07-narrative) — depends on UI + save
  8. Weapons (08-weapons) — depends on inventory + player + UI
  9. AI (09-ai) — depends on player (for detection) + weapons
  10. Adaptive (10-adaptive) — reads everything
  11. Data Assets (14-data-assets) — referenced by all, created when content is stable 12-16. Meta, Settings, Polish, State, Audio — layered on top

System Count by Type

Type Count Examples
BPC_ Blueprint Components 80 HealthSystem, InventorySystem, AIPerception
BP_ Blueprint Actors 11 DoorActor, WeaponBase, EnemyBase
WBP_ Widget Blueprints 14 HUDController, InventoryMenu, MainMenu
DA_ Data Assets 18 ItemData, EquipmentConfig, AtmosphereProfile
SS_ GameInstance Subsystems 7 SaveManager, UIManager, AudioManager
GI_ Game Instances 2 GameFramework, GameTagRegistry
I_ Interfaces 3 InterfaceLibrary, HidingSpot, Persistable
GM_ GameMode, GS_ GameState 2 CoreGameMode, CoreGameState
FL_ Function Library 1 GameUtilities
AI_ Controller, BB_ Blackboard 2 BaseAgentController, AgentBoard
TOTAL 140

Multiplayer Networking Architecture

The framework is built server-authoritative from the ground up. See docs/architecture/multiplayer-networking.md for the full specification.

How Networking Fits the Layers

┌────────────────────────────────────────────────────────────────┐
│  LOCAL-ONLY LAYER (never replicated)                            │
│  WBP_* Widgets, Camera, Embodiment, Debug, Analytics, Tutorials │
├────────────────────────────────────────────────────────────────┤
│  REPLICATED STATE LAYER (server-authoritative)                  │
│  GS_CoreGameState (chapter, objectives, encounter, time)        │
│  Player Components (health, stamina, stress, movement, hide)    │
│  World Actors (doors, containers, pickups, puzzles)             │
│  Inventory (slots, weight, equipment)                           │
│  Narrative (flags, dialogue state, objectives)                  │
│  AI (position, alert state, health — behavior trees on server)  │
│  Adaptive (atmosphere tier, tension, difficulty params)         │
├────────────────────────────────────────────────────────────────┤
│  CLIENT PREDICTION LAYER (cosmetic, corrected by server)        │
│  Weapon fire FX, muzzle flash, recoil, hit markers              │
│  Stamina bar, health bar (predicted; RepNotify corrects)        │
│  Door animations (predicted; OnRep confirms)                    │
├────────────────────────────────────────────────────────────────┤
│  SERVER-ONLY LAYER                                              │
│  AI Behavior Trees, Damage Calculation, Loot Generation         │
│  Save/Load coordination, State Gating validation                │
└────────────────────────────────────────────────────────────────┘

Key Multiplayer Principles

  1. HasAuthority() gate on every mutator function
  2. Server_ RPC for client→server requests
  3. RepNotify fires same dispatchers as SP code — UI needs zero changes
  4. Client prediction for responsiveness; server correction for correctness
  5. AI runs on server only — replicated to clients via Actor replication
  6. UI is local per-client — binds to replicated dispatchers

Architecture Overview v1.0 — Start here before reading category-specific developer docs.