A versioned schema-migration pipeline for Unreal Engine USaveGame objects. When you rename,
retype, add or remove properties between game updates, SaveStateMigrator intercepts the load,
compares the file's stored schema version with your project's current version, and runs a
sequential chain of migration rules to reconstruct a valid, up-to-date save object — instead of
letting the engine's binary serializer silently drop or corrupt data.
Supports Unreal Engine 5.8.
USaveStateMigratorSubsystem::SaveGameWithVersion. The plugin writes a smallUSaveStateMigratorSubsystem::LoadAndMigrateSaveGame. The plugin decodes thePlain engine saves written with UGameplayStatics::SaveGameToSlot are detected and loaded through
the standard path unchanged (no migration).
UGameInstanceSubsystem entry point.SaveStateMigrator.Validate console command for checking old saves against the current schema.Open Project Settings → Plugins → Save State Migrator:
TargetVersion equal to the new version, then add rules:
OldName → NewName.USaveMigrationRule_CustomBP and implement OnApplyMigrationUSaveStateMigratorSubsystem* Migrator = USaveStateMigratorSubsystem::Get(this);
Migrator->SaveGameWithVersion(MySave, TEXT("Slot0"), 0);
USaveGame* Loaded = Migrator->LoadAndMigrateSaveGame(TEXT("Slot0"), 0, UMySaveGame::StaticClass());
Automation tests live under SaveStateMigrator.* (Session Frontend → Automation):
SaveStateMigrator.MigrationChain.LegacyScoreToPlayerScore — the spec integration testfloat LegacyScore = 99.5 → convert → rename → int32 PlayerScore == 100).SaveStateMigrator.Container.RoundTrip — container encode/decode round-trip and rejection of