Skip to main content

Project Architecture

This page gives you the big picture of how SPM is put together, so you know where to look before modifying anything.

Design Philosophy​

SPM is built around ActorComponents instead of putting logic directly into GameModes or Controllers. Almost all systems live in BPC_ components that you attach to your own classes. This makes the template easy to integrate: you add a component (or reparent a class) instead of merging graphs.

Communication between systems goes through Blueprint Interfaces (BPI_), so widgets and components never need hard references to your specific classes.

Core Classes​

All found in Content/SteamPartyMenu/Blueprints/Core/.

BlueprintParentRole
BP_SPM_GameinstanceGameInstancePersistent state that survives level travel: current Steam Lobby ID and network error flags. Implements BPI_GameInstanceInterface.
BP_SPM_PartyControllerPlayerControllerMenu player controller. Carries the BPC_PartyManager component. This is where the whole party system starts.
BP_SPM_PartyGameModeGameModeGame mode for the PartyMenu level.
BP_PlayerStatePlayerStateCarries the BPC_PlayerData component (save game + Steam cloud data).
BP_PartySpotActorOne of the 4 physical pedestals in the menu level where party member avatars stand. Has pedestal mesh, Niagara FX, rect light and a WB_PartySpotIcon widget component.
BP_GC_PartyAvatarCharacterThe character spawned on a party spot to represent a party member. Carries BPC_CharacterCustomization.
BP_NamePlateActorFloating name plate above an avatar (widget component WB_AvatarUserPlate).

Demo/game-side classes in Content/SteamPartyMenu/DemoContent/Blueprints/:

BlueprintParentRole
BP_SPM_GamePlayerControllerBP_SPM_PartyControllerController used in match levels. Inherits the Party Manager component (set to Game type).
BP_SPM_MatchGamemodeGameModeExample match game mode that spreads players over Player Starts and stores the server Lobby ID.
BP_GameCharacterCharacterThird person playable character with BPC_CharacterCustomization so the selected skin carries into the match.

Components​

All found in Content/SteamPartyMenu/Blueprints/Components/.

ComponentAttached to (in template)Purpose
BPC_PartyManagerBP_SPM_PartyController (menu) and BP_SPM_GamePlayerController (game)The heart of SPM. Binds to SIK lobby delegates, manages party creation/joining, avatars, ready check, chat, game server start/join, escape & settings menus. See Party Manager.
BPC_MatchmakingNot attached by defaultWork in progress. A "Looking for Party" matchmaking component, currently used only for testing and not part of the shipped flow.
BPC_PlayerDataBP_PlayerStateLocal SaveGame (SG_PlayerData) + Steam Cloud player data. Implements BPI_PlayerDataInterface. See Player Data.
BPC_PlayerHUDGame controllerIn-match HUD and crosshair management. Implements BPI_HudManagerInterface.
BPC_CharacterCustomizationBP_GC_PartyAvatar, BP_GameCharacterApplies the selected skin/variation mesh to the owning character, manages name plates and spot index.

Interfaces​

Found in Content/SteamPartyMenu/Blueprints/Intefaces/.

InterfaceImplemented byFunctions
BPI_GameInstanceInterfaceBP_SPM_GameinstanceGI_GetLobbyID, GI_SetLobbyID, GI_GetNetworkError, GI_SetNetworkError
BPI_PartyManagmentInterfaceBPC_PartyManagerPMI_GetPartyMenuWidget, PMI_PartySpotCharClicked, PMI_CreateMatchHUD
BPI_PlayerDataInterfaceBPC_PlayerDataPDATA_Get/Save functions for character data, graphics, audio, account settings and game preferences
BPI_HudManagerInterfaceBPC_PlayerHUDHasValidCrosshair?, GetCrosshair, AddCrosshair, RemoveCrosshair
BPI_WidgetManagmentVarious widgetsWidget lifecycle: refresh social tabs, party member lists, spot icons, match HUD creation, leaving-widget handling
BPI_InteractInterfaceSquareFlip demo actorsMinigame interaction (LiffTile)

Because everything talks through interfaces, you can swap in your own GameInstance or widgets as long as they implement the matching interface.

Function Libraries​

Found in Content/SteamPartyMenu/Blueprints/Libraries/. See SPM Blueprint Function Library.

  • BP_SPM_Library: the main library (~40 functions) with component getters, lobby helpers, Steam ID comparison, settings apply/save helpers and server state utilities.
  • BP_HUD_Library: the Get HUD Manager helper.
  • BPML_SPM_Widgets: widget-side helpers (validated lobby ID, async texture/sound loading, Steam user data).
  • BPML_Actors / BPML_Components: soft-reference async loaders for meshes, materials and anim instances, plus lobby member data validation.

Data Assets​

Found in Content/SteamPartyMenu/Blueprints/Structures/DataAssets/. See Used Data Assets.

  • DA_PM_Settings (instance of PM_SettingsData): the central configuration hub for characters, maps, game modes, party sizes, lobby data keys, cloud data keys and notification sounds.
  • CharacterDataAsset instances (DA_MannyData, DA_QuinnData): character name, portrait, mesh variations, anim BP.
  • MapsDataAsset instances (DA_Day_Map, DA_Night_Map): map name, soft level reference, travel string.
  • Themes (ButtonsThemeData, TextThemeDataAsset instances): UI button and text styling, so you can re-skin all modular widgets from data.

State Enums​

Found in Content/SteamPartyMenu/Blueprints/Enums/.

EnumValuesUsed for
E_GameServerStateNoServer, Starting, Live, ShutdownLifecycle of the party's game server, stored as lobby data (see Ready Check & Game Start)
E_ComponentTypeDisabled, Menu, GameSwitches component behavior per level context (menu vs in-match)
E_SpotIndexMainSpot, Index 1, Index 2, Index 3The 4 party spots; MainSpot is always the local player
E_CharacterTypeMenu Avatar, Game Character, First PersonTells BPC_CharacterCustomization how to behave on its owner
E_PedestalStateDefault, Highlighted, Unhighlighted, ReadyVisual state of a BP_PartySpot pedestal

Where State Lives​

Understanding this is key before modifying SPM:

  1. Steam lobby data is the source of truth for everything shared: party size, game mode, selected map, member skins, ready status, game server state. Members write with Set Lobby Data / Set Lobby Member Data and everyone reacts to OnLobbyDataUpdate.
  2. BP_SPM_Gameinstance only stores the current Lobby ID and network error state so they survive level travel.
  3. SG_PlayerData / Steam Cloud store per-player persistent data: selected character skin, settings, game preferences.
  4. Components hold only transient/runtime references (spawned widgets, avatar references, counters).

So when you want to share new data across the party: add a key to DA_PM_Settings, write it into lobby data, and react to it in HandleOnLobbyDataUpdate. Don't try to replicate variables. The menu is not a networked level; everything goes through the Steam lobby.