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.