Save Settings

Access the save settings in the top menu: Tools/Crystal Save/Settings/Crystal Save Settings

Everything that can be setup and configured in Crystal Save has to be done inside the Crystal Save Settings window. The default settings are ready for all non-cloud saving games. The Save Setting files are located here: Assets/Plugins/CrystalSave/Resources/

Save Method

In Crystal Save you can save into the Player Prefs or as Save-File. The default file format is binary (JSON is possible via Cloud Save Settings).

Version

Sets the Game Version. This setting is only required for Save Migration

Save File Name Pattern

The Default String for save and meta files, supports

  • {n} for slot number

  • {meta:key} for meta value as file name. Set Metadata in the Custom Metadata settings

Local Save Data

  • Wipe Local Save Data: One Button Solution to prevent Ghost Saves after dev-test-sessions. Deletes all locally stored Save Files, Metadata and Screenshots, and Player Prefs keys.

  • Open Save Folder: Opens the persistent path/Save Folder

Persistent Path Mode

  • Mode: Default -> Application.persistenDataPath

  • Mode: Custom -> Choose your custom persistentDataPath

  • Optionally Migrate existing Data to new Custom Path

Changing the persistent path can help WebGL builds that fail to save and throw errors. The issue is that Unity has deprecated manual sync. You may see a harmless warning in the browser console today, but in a future Unity version this workaround may stop working, which could also trigger harmless Crystal Save warnings.

Save Migration

  • Auto Save Migrated Data will auto-save the migrated save file into the loaded and migrated slot

Save Slots

Number of Save Slots

The number of Save Slots available

Number of Quick Save Slots

Quick Saves share the same List of Save Slots with Auto Saves and Regular Saves. Set here how many Quick Saves Crystal Save has to remember. By default, they start in a separate block so they won't clash with normal or auto-saves unless the slot numbers overlap.

  • New Quick Saves always go in the first Quick Save Slot and push older ones up

Auto Save Slot Number

Which slot the auto saves uses. Set 0 to disable auto saves. Regular or quick saves can still overwrite this slot if they use the same number.

Cryptography Settings

Enable Encryption

  • Encrypt save blobs with AES-256-GCM before upload/local mirror.

  • Supports all platforms:

    • Uses BouncyCastle (a software encryption library) on WebGL and Linux encryption, which may increase CPU load during load/save operations

Compression Settings

Enable Compression

Compress serialized save data before encryption using GZip. Reduces file size but increases CPU usage and slows load times when saving or loading (mobile devices)

Backup & Verification Settings

Enable Save File Verification

Keep a temporary .bak copy of the previous .sav next to the save file inside Application.persistentDataPath and verify the new save.

  • The backup is deleted after verification succeeds.

  • Backup files are stored only locally and are never uploaded to the cloud

Screenshot Settings

Enable Screenshots

Enable or disable capturing in-game screenshots for each save slot

Screenshot Folder Name

The folder name within peristenDataPath to store screenshots

Screenshot Provider

Select which screenshot provider to use when Naninovel is available. You can hook-in your own screenshot provider through code.

Screenshot Format

Crystal save allows saving of screenshots in the format JPG and PNG

Custom Metadata

Add here your Custom Metadata and default values fields like Player Name, Level, Map Name, etc.

Use in Playmaker SetSaveSlotMetadata or in Game Creator InstructionSetSaveSlotMetadata or set Metadata through code:

Player Name example. Add a new Custom Metadata. Set as Key 'Player Name' (without quotes). We leave Value empty.

SaveSlot slot = SaveManager.Instance.GetSaveSlotByNumber(1);
slot.CustomMetadata = new Dictionary<string, string>();
slot.CustomMetadata["Player Name"] = "John Doe";

Conflict Resolution

Crystal Save can reconcile save conflicts automatically without prompting the player. Enable Auto Resolve Conflicts on the SaveSettings asset or in the settings window to let the system choose which side should win when a local and cloud save both exist for the same slot.

When enabled, you can pick a Conflict Policy:

  • Latest – keep the save with the most recent UpdatedAt timestamp.

  • Oldest – prefer the oldest save.

  • LocalWins – always keep the local file.

  • CloudWins – always download the cloud version.

  • MetadataRules – evaluate up to two metadata comparisons before falling back to the timestamp.

For MetadataRules, define one or two key/operator/value comparisons using metadata keys from SaveSlotMetadataSO. All rules must pass for the conflict to auto-resolve; otherwise the system uses the policy’s fallback behavior.

Logging Settings

Log Level

4 levels:

  • Off - Turns off Logs

  • Error - Show only Errors

  • Warning - Show Errors and Warnings

  • Info - Show all Debug Log Messages

Automatic Registration Settings

Auto Register Tags

Automatically register Tags when the project changes or after assembly reload.

Auto Register Prefabs

Auto-register prefab assets when the project changes or after assembly reload. This setting will be marked obsolete in future releases because the Remember Prefab component will register the Prefab automatically. Leave the setting disabled.

Migration Settings

Auto Save Migrated Data

Overwrite existing Saves after migration: If enabled, an old Save-file gets migrated to the new version and then auto-saved. If disabled, it will migrate an old save-file each time when it is loaded, as it never gets saved in the version format.

Performance (Since Version 1.6.20)

Optimize Runtime Capture

What it does Skips the expensive runtime-modification pass whenever no tracking features are enabled and the prefab root has not changed, returning null immediately to avoid walking the prefab hierarchy.

Why enable it Turn this on when you are not tracking meshes, materials, added components, or child overrides—Crystal Save can bail out early instead of inspecting every component each frame.

Why you might leave it off Disable the optimization if you temporarily turn tracking toggles off for debugging or custom workflows but still need the engine to capture changes, because the optimization short-circuits the capture pipeline in that situation.

Enable Lookup Cache

What it does Stores GameObject references by UniqueID inside SaveManager so subsequent lookups hit a dictionary instead of scanning the scene or falling back to string searches.

Why enable it Helpful in large projects that call FindGameObjectByUniqueID frequently—after the first lookup, Crystal Save simply returns the cached reference.

Why you might leave it off Skip the cache if you want to minimise memory churn or insist on always resolving objects fresh, because the dictionary keeps references alive until they are explicitly uncached or the cache is cleared.

Enable Component Lookup Cache

What it does Lets ComponentManager resolve ISaveable components from a dictionary keyed by UniqueID instead of running a linear search.

Why enable it Use it when scenes contain many saveable components; dictionary lookups keep restore times predictable even as the list grows.

Why you might leave it off Keep it disabled if you rarely query by component ID or want to avoid maintaining the additional dictionary, since the fallback search already handles small component counts cheaply.

Scan for Existing GameObjects

What it does During SaveManager initialisation, finds every RememberGameObject in loaded scenes and registers it with the save system in one sweep.

Why enable it Best for static or hybrid levels where many saveable objects already exist in scenes—registration happens instantly after the manager boots.

Why you might leave it off Disable the scan when almost everything spawns via factories or pooling; each RememberGameObject will instead self-register on Awake, avoiding an up-front scene sweep.

Existing Object Scan Batch Size

What it does Limits how many discovered RememberGameObjects are registered per frame during the startup scan; zero or negative processes them all at once.

Why enable it Assign a positive batch size to spread registration across frames and prevent a noticeable hitch when large scenes contain hundreds of tracked objects.

Why you might leave it off Leave it at zero if you need every object registered before gameplay resumes—for example, when immediately loading a save right after startup.

Prefab Instantiation Batch Size

What it does Controls how many prefabs the load pipeline instantiates before yielding; zero or negative restores everything in one frame.

Why enable it Set a batch size to smooth out load spikes when restoring many prefabs—the coroutine yields after each batch to keep frame times stable.

Why you might leave it off Keep it at zero when you require every saved prefab to appear before gameplay resumes, even if that means a brief frame hitch.

Group Instantiation by Scene

What it does Groups prefab instantiation by target scene, minimising calls to SceneManager.SetActiveScene while restoring saved objects.

Why enable it Great for multi-scene setups where bouncing the active scene repeatedly is expensive; Crystal Save restores each scene block in one pass.

Why you might leave it off Disable grouping if your gameplay logic depends on the exact original spawn order across scenes or you prefer to keep the active scene untouched during loads.

Component Apply Batch Size

What it does Batches how many component payloads are applied per frame during load; zero applies all components immediately.

Why enable it Use a positive batch to prevent deserialising thousands of components in one frame when restoring complex scenes asynchronously.

Why you might leave it off Leave it at zero when you need every component state applied before continuing (e.g., when immediately handing control back to the player).

Active State Apply Batch Size

What it does Determines how many tracked GameObject active-state toggles run per frame when replaying saved activation data; zero applies them all at once.

Why enable it Batching is useful when thousands of objects need activation changes at load time—you can phase them in without freezing the main thread.

Why you might leave it off Set it to zero if consistent activation order is critical (for example, puzzle logic that expects every object to toggle within the same frame).

Sync Transforms After Prefab Load

What it does Defers Physics.SyncTransforms() until every restored prefab finishes its second-phase setup, instead of syncing after each rigidbody.

Why enable it Ideal when restoring many physics objects—the engine avoids repeated sync calls and performs one consolidated update at the end of the load pass.

Why you might leave it off Keep it disabled if you depend on transforms being synchronised immediately after every rigidbody restore (for example, if gameplay logic samples physics state mid-load).

Prefab Pooling

Use Prefab Pooling

What it does Spawns and recycles SaveablePrefab instances through Crystal Save’s pooling layer instead of instantiating and destroying them every time.

Why enable it Great for frequently spawned prefabs (projectiles, pickups)—pooling trims allocation spikes and allows pooled instances to be returned instead of destroyed.

Why you might leave it off

  • Disable pooling if your prefabs carry complex one-off state or you prefer Unity to destroy them outright to ensure full teardown each time.

  • You also want to disable it if you want to make use of the Restore Destroyed GameObject/Prefab feature

Default Prefab Pool Size

What it does Defines how many instances each pool keeps “warm” when pooling is enabled; pools are created with this target capacity.

Why enable it Raise the number when you expect bursts of spawns so the pool pre-instantiates clones during warm-up instead of at gameplay time.

Why you might leave it low Keep the value small if memory is tight or the prefab rarely appears; extra pooled clones reserve CPU/GPU resources even when idle.

Spawn Pooled Prefabs in Scene

What it does Moves spawned pooled instances into the currently active scene rather than leaving them under the global pool root.

Why enable it Use this when pooled objects must interact with scene-specific lighting, audio zones, or scene-based management scripts that rely on membership in the active scene.

Why you might leave it off Keep it disabled if you rely on pooled objects living in a persistent scene (for example, cross-scene managers) and do not want them moved automatically.

Pooled Prefab Spawn Batch Size

What it does When batching is enabled, limits how many pooled clones are created or destroyed per frame while resizing the pool; zero means adjust capacity immediately.

Why enable it Set a positive number to prevent hitches when pools need to warm up dozens of instances—capacity adjustments yield after each batch.

Why you might leave it off Leave it at zero if you prefer instant pool resizing (for example, when preparing in a loading screen where frame spikes are acceptable).

Enable Pooled Prefab Batching

What it does Switches pool capacity adjustments to a coroutine-based path that honours the batch size instead of resizing immediately.

Why enable it Activate this option when you want to combine pool resizing with the spawn batch size to spread work across frames during gameplay.

Why you might leave it off Disable batching when pool adjustments happen off the critical path (for example, in editor tooling or loading screens) and you prefer the simpler immediate logic.

Addresables Settings

This setting is only visible if you have the Unity Addressables Package installed. Install the Addressables Package with the Unity Package Manager.

Use Addressables

Enabling Addressables will tell the class AssetProvider to make use of Addressables instead of loading assets through Resources folder.

Cloud Save Settings

Enable Cloud Save

If true, the SaveSystem will use a Cloud Save Solution instead of local saving methods.

Save Backend

  • Unity Cloud Save

  • Supabase

  • Self-hosted MySQL web server

  • Firebase

Default Auth Provider

Authentication method that will run before Cloud Save becomes available. Choose between:

  • Anonymous

  • Unity (Unity Player Account)

  • Username & Password

  • Google Play

  • Apple

  • Facebook

  • Steam

    • Comes with a basic integration for Steamworks.net. Please check SteamManager class in Assets/Plugins/CrystalSave/Runtime/Utility/Platform/SteamManager.cs

Cloud Save Transport

Some WebGL host solutions and Cloud Save providers require save-files in JSON format. Choose between JSON and Binary. Choosing JSON will convert Binary Save-File as JsonBase64 (quoted Base64). Please note: This conversion will not create a human-readable file.

Keep Local Mirror

Store screenshots, metadata, save-files locally even when Cloud Save is enabled.

Upload Screenshots & Metadata

Save also screenshots files and slot metadata to Unity Cloud Save

Auto-Login Unity Cloud Save

If enabled, SaveManager will auto-sign in to Unity Cloud Save on startup. Useful if Default Auth Provider is set to Anonymous. Turn off to handle login yourself via a custom UI.

Prefab Registry

Prefab Entries

Prefabs that get a Remember Prefab component attached, get automatically added to the Prefab Registry. Here you can Register, edit, validate or delete Prefabs manually. Registering a prefab manually if auto-registering fails, do it manually:

  • Click on your prefab

  • if not already added, add a Remember Prefab component

  • Click on the Copy ID button at the bottom of the component

  • Go to your Prefab Registry in the Crystal Save Settings and click on the plus button to add a new empty element.

  • Paste the ID into Unique ID and reference the Prefab via drag and drop

Button Auto-Register Prefab Assets

if auto-registering fails, do it automatically:

  • Click on the Auto-Register Prefab Assets button

    • This process can take up to several minutes depending on the number of prefabs in your project

Button Validate UniqueIDs

Wipes the Unique ID in the Prefab and checks Prefab Registry entries for missing or duplicate PrefabAssetID strings and offers to auto-fix problems.

Button Clean Duplicates

Removes duplicate prefab rows (same asset GUID) from the Prefab Registry, keep the first occurrence.

Deregister & Purge Prefabs

Removes all Crystal Save components (Remember components, Remember Prefab component and other hidden Crystal Save components) from all registered prefabs and wipes registry.

Tag Registry

Tags

Add, Edit or Remove Tags or Auto-Add Tags by clicking on the button Auto-Register Tags. This setting is likely never touched and only relevant if Auto Register Tags is disabled

Scene Object Registry

Scene Object Entries

Manage here scene objects and their prefab mappings for restoration. This Registry is relevant if you destroy GameObjects during runtime, and you want to restore these destroyed GameObjects with an identical prefab-version.

  • Requirements

    • Remember Component with added Remember GameObject component

    • Remember GameObject remembers Destroyed

    • Prefab representation shares the same UniqueID

      • Access the Unique ID by clicking in the Remember Component on Unique ID

Register a Scene GameObject

Create a prefab representation of the Scene Game object. Make sure they share the same Unique ID.

  • Copy the Unique ID and paste it in the Unique ID field.

  • Reference the prefab

  • After Scene Reload, you will see a linked symbol in the hierarchy window, this means this GameObject can now be restored.

Please note the settings Scenes to Scan, Use Prefab Link Fallback and Auto-Populate Scene Objects are currently not working as expected and will get fixed in a later version.

Last updated