Quick Start: World Actors

By the end, an actor placed in your level (a door, chest, lever) - or one spawned at runtime - remembers its state across save and load. World actors opt in through ICrimsonSaveableActor and, unlike saveable systems, need no registration.

World actors vs systems
This track is for actors that live in a level. For data-owning objects that are not level actors - inventory, progression, settings - follow Quick Start: Saveable Systems instead.
Prerequisites
The CrimsonSaveSystem plugin is enabled (see Quick Start: Saveable Systems -> step 1, or the Overview), and you have a way to trigger a save. An active save slot must exist - start or load one first.

1. Implement ICrimsonSaveableActor

Add the interface to the actor. That is the only opt-in - there is no register call. On every save the world subsystem scans loaded levels, finds each actor that implements the interface, and captures it automatically.

Open the actor Blueprint and go to Class Settings -> Details -> Interfaces -> Add -> Crimson Saveable Actor. Compile and save. That is the whole opt-in: no event to override, no node to wire, no registration call. (On the full Crimson stack you can instead reparent the Blueprint to ACrimsonPersistentActor (CrimsonCore - requires all Crimson plugins), which already carries the interface and a persistent id component.)

No registration - this is the key difference
Saveable systems must call Register Saveable System. World actors must not - implementing ICrimsonSaveableActor is the whole opt-in. The world subsystem discovers them by scanning loaded levels (bAutoCaptureActorsOnSave, default on).

2. Mark the state you want to persist as SaveGame

Tag each property SaveGame. Fields on the actor's components count too - component state cascades in automatically, along with transform, the hidden flag, and physics velocities.

Select each variable on the actor in My Blueprint -> Details -> Advanced -> tick `SaveGame`. Repeat for every property you want to persist, and do the same on the actor's own components: their SaveGame fields cascade in automatically, alongside the actor's transform, hidden flag, and physics velocities, which are captured for you with no flag at all.

3. Save and reload

A normal save persists world actors too: with bIncludeWorldStateInMainSave (default on), RequestSaveProgress captures and flushes every saveable actor alongside your systems, and a load restores them. You do not call anything per actor.

There is nothing per-actor to call. Get Crimson Save Game Manager -> Request Save Progress writes the active slot, and your world actors ride along because bIncludeWorldStateInMainSave is on by default. For a fresh slot use Request New Game Save (Slot Index = 0, Character Name) instead, and Request Load From Slot (Slot Index = 0) brings every saveable actor back.

Saving is server/standalone only. From an actor graph, put Has Authority (Branch, True) in front of the manager getter; from a client's menu widget, send a Server_ RPC through the player controller and make the call there.

Verify
In PIE: change the value (open the door), save, then reload the slot - the door is open again. No per-change call was needed. With the default storage provider on PC, a Slot0_W_<Level>.sav blob appears in Saved/SaveGames/.
Multiplayer: SaveGame is not Replicated
SaveGame and Replicated are independent. Restored values live on the server; a client sees them only if the property is also Replicated. Full explanation: Concept: Multiplayer & Save Scopes.
What's next
Control what happens when a saveable actor is destroyed (stay gone vs respawn) and link one saved actor to another: see How-To: Persist a Level Actor, How-To: Save Cross-Object References, and How-To: Turnkey Save Setup with CrimsonCore.