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/.
| Blueprint | Parent | Role |
|---|---|---|
BP_SPM_Gameinstance | GameInstance | Persistent state that survives level travel: current Steam Lobby ID and network error flags. Implements BPI_GameInstanceInterface. |
BP_SPM_PartyController | PlayerController | Menu player controller. Carries the BPC_PartyManager component. This is where the whole party system starts. |
BP_SPM_PartyGameMode | GameMode | Game mode for the PartyMenu level. |
BP_PlayerState | PlayerState | Carries the BPC_PlayerData component (save game + Steam cloud data). |
BP_PartySpot | Actor | One 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_PartyAvatar | Character | The character spawned on a party spot to represent a party member. Carries BPC_CharacterCustomization. |
BP_NamePlate | Actor | Floating name plate above an avatar (widget component WB_AvatarUserPlate). |
Demo/game-side classes in Content/SteamPartyMenu/DemoContent/Blueprints/:
| Blueprint | Parent | Role |
|---|---|---|
BP_SPM_GamePlayerController | BP_SPM_PartyController | Controller used in match levels. Inherits the Party Manager component (set to Game type). |
BP_SPM_MatchGamemode | GameMode | Example match game mode that spreads players over Player Starts and stores the server Lobby ID. |
BP_GameCharacter | Character | Third person playable character with BPC_CharacterCustomization so the selected skin carries into the match. |
Components
All found in Content/SteamPartyMenu/Blueprints/Components/.
| Component | Attached to (in template) | Purpose |
|---|---|---|
BPC_PartyManager | BP_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_Matchmaking | Not attached by default | Work in progress. A "Looking for Party" matchmaking component, currently used only for testing and not part of the shipped flow. |
BPC_PlayerData | BP_PlayerState | Local SaveGame (SG_PlayerData) + Steam Cloud player data. Implements BPI_PlayerDataInterface. See Player Data. |
BPC_PlayerHUD | Game controller | In-match HUD and crosshair management. Implements BPI_HudManagerInterface. |
BPC_CharacterCustomization | BP_GC_PartyAvatar, BP_GameCharacter | Applies the selected skin/variation mesh to the owning character, manages name plates and spot index. |
Interfaces
Found in Content/SteamPartyMenu/Blueprints/Intefaces/.
| Interface | Implemented by | Functions |
|---|---|---|
BPI_GameInstanceInterface | BP_SPM_Gameinstance | GI_GetLobbyID, GI_SetLobbyID, GI_GetNetworkError, GI_SetNetworkError |
BPI_PartyManagmentInterface | BPC_PartyManager | PMI_GetPartyMenuWidget, PMI_PartySpotCharClicked, PMI_CreateMatchHUD |
BPI_PlayerDataInterface | BPC_PlayerData | PDATA_Get/Save functions for character data, graphics, audio, account settings and game preferences |
BPI_HudManagerInterface | BPC_PlayerHUD | HasValidCrosshair?, GetCrosshair, AddCrosshair, RemoveCrosshair |
BPI_WidgetManagment | Various widgets | Widget lifecycle: refresh social tabs, party member lists, spot icons, match HUD creation, leaving-widget handling |
BPI_InteractInterface | SquareFlip demo actors | Minigame 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 Managerhelper. - 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,TextThemeDataAssetinstances): UI button and text styling, so you can re-skin all modular widgets from data.
State Enums
Found in Content/SteamPartyMenu/Blueprints/Enums/.
| Enum | Values | Used for |
|---|---|---|
E_GameServerState | NoServer, Starting, Live, Shutdown | Lifecycle of the party's game server, stored as lobby data (see Ready Check & Game Start) |
E_ComponentType | Disabled, Menu, Game | Switches component behavior per level context (menu vs in-match) |
E_SpotIndex | MainSpot, Index 1, Index 2, Index 3 | The 4 party spots; MainSpot is always the local player |
E_CharacterType | Menu Avatar, Game Character, First Person | Tells BPC_CharacterCustomization how to behave on its owner |
E_PedestalState | Default, Highlighted, Unhighlighted, Ready | Visual state of a BP_PartySpot pedestal |
Where State Lives
Understanding this is key before modifying SPM:
- 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 Dataand everyone reacts toOnLobbyDataUpdate. - BP_SPM_Gameinstance only stores the current Lobby ID and network error state so they survive level travel.
- SG_PlayerData / Steam Cloud store per-player persistent data: selected character skin, settings, game preferences.
- 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.