How-To: Turnkey Save Setup with CrimsonCore

Goal: get a working save/load loop with essentially no C++ by using the ready-made integration in the CrimsonCore plugin.

Prerequisites
Your project uses CrimsonCore (its GameMode ACrimsonGameMode, GameState, and ACrimsonPlayerState). CrimsonCore already depends on CrimsonSaveSystem.

1. Use the CrimsonCore game framework classes

ACrimsonGameMode already forwards player login/logout to the save manager (NotifyPlayerLoggedIn / NotifyPlayerLoggedOut) and saves on exit, and ACrimsonPlayerState already saves its per-player data (stat tags, squad id) as a player-scoped fragment. No wiring needed.

Verify
In a Listen Server + Client PIE test with bVerboseLogging on, the log shows the player's fragment loading on join and flushing on leave.

2. Make your world actors persist

Reparent placed actors to ACrimsonPersistentActor (it implements ICrimsonSaveableActor for you) and mark their variables SaveGame. Shipped ACrimsonCorePickupActor pickups already persist as collected.

New Blueprint Class -> search `Crimson Persistent Actor` -> mark your variables' SaveGame flag.

3. Drive New Game / Save / Load from your menu

UCrimsonSaveFacade is a Blueprint function library with one-call helpers. Save Game guarantees an active slot and - because the main save includes world state - persists systems and world actors in one call.

Save menu widget: buttons call `Start New Game`, `Save Game`, `Load Game`, `Get Save Slots`, `Delete Slot` on the Crimson Save Facade.
Verify
New Game -> change a persistent actor -> Save -> restart PIE -> Load. Everything comes back, with no save code written by you beyond the menu button bindings.

See also

  • How-To: Build a Save/Load Menu - the full slot-list / delete / metadata recipe
  • How-To: Save Player Progression - extend the player-state fragment
  • How-To: Persist a Level Actor - the raw-interface path without CrimsonCore