list-timelineChangelog

Update Notice:

  • Please create Backups of your Project and Crystal Save Settings!

  • Recommended: Delete the previous version before importing the new version

Crystal Save - Version 1.7.12 - 10 Feb 2026

Changed

  • Scene Object Registry scan behavior is now explicit and predictable. Added SceneObjectScanMode and removed the old implicit fallback behavior. Matching is now strict UniqueID equality only (scene object UniqueID ↔ prefab UniqueID). Removed the "Use Prefab Link Fallback" toggle/logic.

  • New settings: SaveSettings.sceneObjectScanMode = CurrentOpenedScene | ScenesInBuildList | AllScenesInProject | Custom. Custom mode: if "Scenes to Scan" is empty, it defaults to the currently opened scene.

  • UI: Scene Object Entries list is now always visible; only "Scenes to Scan" is conditional to Custom mode.

Fixed

  • Fixed misleading "Missing SaveablePrefab" warning spam.

  • WarnIfMissingSaveablePrefab no longer fires for normal scene-placed objects. The warning is now limited to likely runtime-instantiated prefab-like objects not under a SaveablePrefab hierarchy and not covered by SceneObjectRegistry mappings. Added scene-placement caching and registry-aware identifier variant checks to suppress benign cases.

  • Fixed: Zombie Prefab Accumulation (save file grows every cycle)

  • SaveManager.CollectSaveData() no longer blindly re-merges prefab entries for instances that were instantiated during load but destroyed at runtime. This prevented unbounded save growth and "zombie" prefab instances spawning on later loads.

  • Implementation: Merge loop now checks PrefabManager.GetInstantiatedPrefabs() and drops stale InstanceIDs (non-placeholder entries that were unregistered). CurrentSaveData is now updated to the freshly collected SaveData after each save to avoid re-merging stale session data. Duplicate detection now uses HashSet for better performance.

  • Fixed: PrefabManager tracking flags ordering bug (TrackComponentBlobs could be lost during restore)

  • PrefabManager.InstantiatePrefabInternal() now restores tracking flags before SetUniqueID(). Previously, SetUniqueID() triggered component registration that read TrackComponentBlobs from the prefab asset defaults (often false) instead of the saved runtime value, causing components to go QUEUING PENDING and never resolve (data loss).

  • Correct order is now: SetOriginalPrefabAsset → tracking flags → SetUniqueID → registration → visibility → ApplyRuntimeModifications.

  • Fixed: Fallback component matching could route prefab data to the wrong instance

  • ComponentManager.ApplyComponentEntry() fallback matching (componentID-only) is now restricted to scene-baked objects by excluding components under a SaveablePrefab parent. This prevents silent cross-instance data misrouting.

  • Fixed: Orphaned pending component data re-persisted forever

  • ComponentManager.CollectComponentData() now verifies the owning GameObject still exists before persisting pending entries. Orphaned entries from destroyed prefab instances are dropped (with diagnostic logging), preventing +60...100 entries per save cycle growth.

  • Fixed regression: Zombie/orphan filters incorrectly dropped unloaded-home-scene entries

  • Entries for RememberHomeScene prefabs were incorrectly dropped when their HomeScene was not currently loaded (legitimate multi-scene data). Filters now check SceneManager.GetSceneByName(pd.HomeScene) before dropping. If the home scene is not loaded, entries are preserved. This also fixes Keep Across Scenes / Off-Screen behavior being ignored for the same reason.

  • Fixed: Keep Across Scenes visibility settings not restored in PrefabManager reuse path

  • PersistentVisibilityController settings (Visible In Scenes, Off-Screen Behaviour) are now restored from SaveablePrefabData.VisibilitySettingsData when loading prefabs via the reuse path. Previously, reuse path skipped deserialization so PVC reverted to Awake defaults and prefabs became visible in all scenes.

  • Fixed: Snapshot-based scene switching missing PVC visibility sweep

  • Snapshot-based scene switches bypassed the SceneLoadManager state machine, so post-processing could re-enable renderers/colliders after PVC.OnSceneLoaded. Added a final ReapplyPersistentVisibility sweep at the end of both snapshot-based scene-switch methods to re-apply ApplyVisibilityBasedOnScene for the newly-active scene.

  • Fixed: Prefab instances could be missing PersistentVisibilityController (PVC), causing Off-Screen Behaviour to silently fail

  • SaveablePrefab.InitializeInstance() now auto-adds PVC at runtime when KeepAcrossScenes/RememberHomeScene is enabled (with offScreenMask) but PVC is missing. This runs before RememberHomeScene clears offScreenMask so PVC captures the intended flags. ReapplyPersistentVisibility also auto-adds PVC as a fallback during scene switching.

  • Fixed: RememberComposite children didn't inherit RememberHomeScene from SaveablePrefab (snapshot restore skipped)

  • Design-time propagation added. Toggling RememberHomeScene on a SaveablePrefab now syncs rememberHomeScene + homeScene onto sibling SaveableComponents on the same GameObject (serialized to the prefab asset with Undo support). SaveableComponentEditor now displays the actual synced state (and says "synced from SaveablePrefab"). RememberComposite.RefreshComponents inherits RememberHomeScene/HomeScene from a sibling SaveablePrefab when creating child components. Runtime inheritance fallback in SaveableComponent.Awake() is retained for edge cases.

  • Fixed: OnActiveSceneChanged could wipe scene snapshot during managed transitions

  • SaveManager.OnActiveSceneChanged no longer snapshots/clears scene caches while isInSceneTransition is true. This preserves the snapshot data captured by PopulatePendingPrefabsFromSnapshotAsync during snapshot-based scene transitions.

  • Fixed: Unstable componentIDs caused snapshot data loss for RememberComposite children

  • SaveableComponent.Awake() no longer assigns a random GUID when componentID is empty. Empty componentIDs are now deterministic: {TypeName}{siblingIndex} (e.g., RememberMeshRenderer_0). This stabilizes snapshot keys ({goUID}{componentID}) across destroy/re-create cycles.

  • Fixed: Snapshot system invisible to SaveablePrefab objects without a UniqueID component

  • SnapshotObjectToSceneCache now falls back to SaveablePrefab.UniqueID when UniqueID component is missing/empty. SnapshotSceneAll now discovers SaveablePrefab components in addition to UniqueID components (with HashSet dedupe). Prefabs that intentionally strip UniqueID (e.g., composites) are now snapshotted correctly.

Crystal Save – Version 1.7.1 – 5 Feb 2026

Added

  • Disabled Component Registration system to automatically register SaveableComponent instances on inactive GameObjects (which don’t receive Awake() / OnEnable()).

  • New settings: SaveSettings.registerDisabledComponents (default: true) SaveSettings.disabledComponentScanMode OnInitialization (scan once at startup) OnSceneLoad (default; scan on each scene load) SaveSettings.scanOnlyActiveScene (default: true)

  • New API: SaveManager.RegisterExistingSaveableComponentsInScene(Scene scene) for scene-specific registration.

  • Logging for disabled component registration: [SaveManager] Registered X SaveableComponent(s) on inactive GameObjects. [SaveManager] Registered X SaveableComponent(s) on inactive GameObjects in scene 'SceneName'.

Changed

  • SaveManager.RegisterExistingSaveableComponents() visibility changed from private to internal.

  • Editor: Added a “Disabled Component Registration” section in the Crystal Save Settings window under Performance, including toggles/dropdowns with detailed tooltips.

Fixed

  • Remember Home Scene: Components that start disabled now correctly auto-fill HomeScene at registration when missing (ComponentManager).

  • Scene transition active-state issues: Prevented incorrect active-state overrides by skipping GameObjectTracker active-state application for RememberHomeScene objects while they’re in their home scene. Fixed RememberGameObject active-state caching so lastKnownActiveState updates only when not loading/transitioning and not applying active state. Fixed Home Scene snapshot capture to use the current active state during snapshots and to prefer GameObjectTracker state when available, reducing transition mismatches.

  • Snapshot / populate flow adjustments (SaveManagerExtensions): Home Scene snapshots are captured after in-memory save data collection. Persisted snapshots are imported when populating from slot. Component deserialization bookkeeping is reset during snapshot-based populate.

Fixed: Stale Component Reference Cache (Critical, build-only failure case)

  • Fixed a bug where saved component data could fail to restore after scene transitions in builds due to stale destroyed SaveableComponent references remaining in the ComponentManager cache.

  • Implementation: SaveableComponent.OnDestroy() now unregisters via ComponentManager.UnregisterSaveableComponent(this). ComponentManager.FindComponentByUniqueID() now detects and removes stale Unity-null references defensively.

  • Files changed: SaveableComponent.cs ComponentManager.cs

Crystal Save – Version 1.7.0 – 4 Feb 2026

Added

Sync scaffolding (new sync pipeline)

  • Sync scaffolding: ISyncTransport, ISyncSerializer, SyncManager, SyncSettings.

  • JSON serializer + Sync envelope models.

  • Binary delta diff codec + reconciliation helper (server-side apply).

  • NGO 2.7.0 transport adapter (guarded by REMEMBERME_NGO_PRESENT).

Encryption upgrades (key sources + server-side crypto)

  • Encryption key source selector (Static / Server / User Passphrase) with new provider assets.

  • Server-side Cloud Crypto mode + Server-Side Crypto Provider (keeps the master key off the client).

  • Cloud crypto provider interface for custom backends.

  • Updated encryption guide with server endpoint spec + minimal Node.js/C# / PHP samples.

  • Settings UI updates: Key Source, Cloud Crypto Mode, clearer warnings, and passphrase salt note.

  • Renamed the Static key asset menu entry to Static Master Secret (was Save Encryption Key).

  • One-click server key export button in the Crystal Save Settings window.

  • Use User ID for Encryption toggle (global key option with warnings).

  • Runtime Asset Overrides (preloaded asset references) to bypass Resources/Addressables lookup for core settings, including LoggerConfig/Migration/Metadata.

Diagnostics

  • Debug logging for save operations: [SaveCoroutine] logs track overall save progress [PrefabManager] logs show prefab collection progress [SaveablePrefab] logs show individual prefab processing (Logged at Info level in the Unity Console.)

Changed

Save pipeline

  • Save pipeline can emit snapshot/diff sync when enableSync is enabled.

Encryption behavior rules

  • Client-side encryption is skipped when Cloud Crypto Mode = ServerSide.

  • Keep Local Mirror is ignored for server-side crypto to avoid local disk writes.

  • SaveSync is blocked for server-side crypto (network required).

  • Encryption init now disables if the provider does not implement IMasterSecretProvider.

Fixed

Save operation hanging bug with SaveablePrefabs

Fixed a critical issue where the Save Slot Manager Window’s action buttons (Save/Load/Delete/etc.) could remain permanently disabled after a save attempt when SaveablePrefab components existed in the scene.Root causes addressed:

  • Exceptions during CaptureRuntimeModifications() / CollectSaveData() weren’t reliably contained.

  • Screenshot capture could wait indefinitely if a callback never fired.

  • Coroutine exceptions don’t propagate cleanly, enabling silent failures.

  • HandleSaveCompletion() wasn’t called when the coroutine crashed, leaving isSaving = true.

Files changed:

  • Runtime/Managers/PrefabManager.cs

  • Runtime/Components/Prefab/SaveablePrefab.RuntimeMods.cs

  • Runtime/Components/Prefab/SaveablePrefab.SaveData.cs

  • Runtime/Managers/Services/SaveOperationService.cs

Fixes applied:

  • PrefabManager.CollectPrefabData(): Try/catch per prefab around CreatePrefabData() so one broken prefab doesn’t kill the save. Detailed progress logging (processed X/Y). Null prefab check + warning.

  • SaveablePrefab.RuntimeMods: Null checks (e.g., tr.gameObject) before access. Handles MissingReferenceException for destroyed objects. Generic exception catch so child-state issues can’t break the save. Progress logging during child-state processing.

  • SaveablePrefab.SaveData: Logs when TryBuildSaveData() starts per prefab. Logs when TryCaptureCurrentState() fails.

  • SaveOperationService.SaveCoroutine: Logging at each major step (screenshot, data collection, serialization). Screenshot capture timeout protection (continues without screenshot instead of hanging). Ensures cleanup/finish logic runs on failure paths.

Screenshot capture hanging in Editor when Game View is not active (Editor-only)

Fixed an Editor-only hang at “Starting screenshot capture…” when users switch away from the Game view during a save.Root cause: WaitForEndOfFrame() requires the Game view to be rendering; when the Game view stops rendering, it never completes.Fix applied:

  • SaveOperationService.cs Restructured screenshot capture from blocking yield return to StartCoroutine() (non-blocking) Timeout loop runs in parallel; stops hanging capture and continues without screenshot

  • ScreenshotManager.cs Added Editor-specific safeguard with an internal timeout Logs a helpful tip: keep Game view visible/running during Editor saves

Note: Builds are unaffected because the game window is always active.

Crystal Save – Version 1.6.54 – 13 Jan 2026

Added

  • RememberTMPText Component - New component for saving and restoring TMP_Text properties.

    • Text content, font size, font style, font asset reference

    • Color, color gradient, alpha

    • Character/word/line/paragraph spacing

    • Alignment, word wrapping, overflow mode, margins

    • Max visible characters, rich text enabled state

    • Supports both TextMeshProUGUI (Canvas) and TextMeshPro (3D World)

  • RememberTMPButton Component - New component for saving and restoring Button with TMP child text.

    • Button interactable state, transition type, colors (ColorBlock)

    • TMP child text content, font size, color

    • Uses GetComponentInChildren<TMP_Text>() to find the button label

  • RememberTMPDropdown Component - New component for saving and restoring TMP_Dropdown.

    • Selected value, interactable state

    • Full options list with text and sprite references

    • Colors (ColorBlock)

    • Caption text, font size, color

    • Item text font size, color

    • Sprite serialization via AssetProvider path lookup

  • RememberTMPInputField Component - New component for saving and restoring TMP_InputField.

    • Text content with optional SetTextWithoutNotify for silent loading

    • Interactable, read-only, rich text states

    • Character limit, content type, line type, input type, keyboard type, character validation

    • Caret properties: blink rate, width, color, custom caret color

    • Selection color

    • Placeholder text and color

    • Text component font size and color

    • Colors (ColorBlock)

Crystal Save – Version 1.6.53 – 12 Jan 2026

Added

  • **RememberMeshFilter Component** - New component for saving and restoring MeshFilter mesh references and procedural mesh data.

    • `RememberMeshReference` toggle to save mesh asset references (loaded via AssetProvider)

    • `RememberProceduralMeshData` toggle for saving full mesh data for runtime-modified meshes

    • Optional toggles for UV2, UV3, UV4, vertex colors, and tangents

    • Supports both asset-based meshes (via Resources/Addressables) and procedurally generated meshes

  • **MeshData Serialization Class** - New serializable data structure (`MeshData.cs`) for comprehensive mesh serialization:

    • Asset reference support via `MeshAssetPath`

    • Full procedural mesh data: vertices, normals, triangles, UVs, tangents, colors

    • Submesh support with separate triangle arrays per submesh

    • Bone weights and bind poses for skinned meshes

    • Mesh bounds serialization

  • **RememberSkinnedMeshRenderer Mesh Support** - Added mesh reference and procedural mesh options:

    • `RememberMeshReference` toggle to save sharedMesh asset reference

    • `RememberProceduralMeshData` toggle for runtime-modified meshes

    • Optional toggles: `IncludeUV2`, `IncludeUV3`, `IncludeUV4`, `IncludeColors`, `IncludeTangents`

    • `IncludeBoneWeights` and `IncludeBindPoses` for fully procedural skinned meshes

  • **LogCategory.RememberMeshFilter** - Added new log category for MeshFilter-related logging

Fixed

  • **PrefabManager Animator Restore Safety Check** - Added validation before restoring Animator state in `InstantiatePrefabsCoroutine` (line 1914). Now checks `anim.isActiveAndEnabled && anim.gameObject.activeInHierarchy` before calling `anim.Play()` to prevent errors when restoring prefabs with inactive or disabled Animators. Previously only checked `anim != null`.

Crystal Save – Version 1.6.52 – 07 Dec 2025

  • Added support for saving and loading procedurally generated GameObjects

  • Updated Online Documentation

  • Remember Prefabs should no longer generate a mismatching Prefab Asset ID - If the issue occurs again it will show a warning in the inspector and a fix button

  • The button 'Validate Unique IDs' in the Prefab Registry in the Crystal Save Settings fixes now mismatching IDs as well

Crystal Save – Version 1.6.51 – 24 Nov 2025

  • Crystal Save supports now dynamic Save Slots:

  • Add/Remove Save Slots at runtime

  • Save the runtime modified Save Slot count via Remember Save Slot Count

Crystal Save – Version 1.6.50 – 24 Nov 2025

Critical Bug Fixes:

  1. Scene Name Detection Fixed SaveSlotManager.HasSaveInSceneAsync(): Fixed to properly check scene name when hasMetaData=false. Previously returned true for any slot with data, ignoring the scene filter.

  2. File Path Resolution Corrected SaveSlotManager.SaveFileExistsAsync(): Fixed to use proper slot subdirectory structure (slot1/, slot2/, etc.) and resolve filename patterns using NamePatternResolver.Resolve(). Previously used incorrect path format without slot folders.

  3. Date Filtering Fixed SaveSlotManager.HasSaveAfterAsync(): Fixed to check date when hasMetaData=false. Previously ignored date parameter and returned true for any save file.

Technical Details:All affected components now properly support:

  • Custom save file name patterns (e.g., "SlotAAAA_{n}", "{meta:playerName}_Slot{n}")

  • Custom metadata file patterns (e.g., "Meta{n}.json")

  • Custom persistent path modes (Default vs Custom folder structure)

  • Slot subdirectory structure ({rootPath}/slot{n}/{resolvedPattern}.sav)

  • Pattern placeholder resolution ({n} → slot number, {meta:key} → custom metadata values)

Affected Classes:

  • SaveSlotManager (SaveFileExistsAsync, HasSaveInSceneAsync, HasSaveAfterAsync)

  • GC2 related:

  • InstructionBranchOnHasSaveInSceneAsync

  • InstructionLoadMostRecentSlot

  • ConditionHasSaveInScene

  • ConditionHasSaveAfterDate

  • ConditionHasSaveAtSlot

  • SaveManagerExtensions (LoadMostRecentSlot)

Impact:

  • Scene-based save detection now works correctly in all contexts

  • Custom filename patterns are fully supported across all save/load operations

  • Date-based filtering now works consistently with and without metadata

  • Load operations properly restore saved scenes by default

Crystal Save – Version 1.6.49 – 22 Nov 2025

  • Fixed Logger Namespace error upon import into a new project

Crystal Save – Version 1.6.48 – 21 Nov 2025

  • Unity Editor Improvement: Added Optimizations for scenes with ten thousands of Remember Components.

Crystal Save – Version 1.6.47 – 18 Nov 2025

  • Fixed a caching issue in tracked gameobject states

Crystal Save – Version 1.6.46 – 18 Nov 2025

  • Fixed a Namespace Error caused by the DefineSymbol class

  • Define Symbol accidentally added the REMEMBERME_GC2CORE_PRESENT symbol to Player Settings if Time Crystal was present. Please manually remove the symbol REMEMBERME_GC2CORE_PRESENT from the Player Settings.

Crystal Save – Version 1.6.45 – 14 Nov 2025

  • Added new HasAnySaveInSlotsAsync & HasAnySaveInSlots in SaveManager API

  • HasSave & HasSaveAsync will be marked for deprecation in later versions.

  • Fixed minor Build warning for unused variable

Crystal Save – Version 1.6.44 – 13 Nov 2025

  • Fixed DefineSymbols for Time Crystal

Crystal Save – Version 1.6.43 – 13 Nov 2025

  • Remember Prefab no longer auto-generate a Instance Unique ID in Prefab Edit Mode

  • Added SaveManager AutoLoad method

  • Improved SaveManager AutoSave

  • Added Groundworks for Time Crystal

Crystal Save – Version 1.6.42 – 02 Nov 2025

  • Fixed Skip Saving When Unchanged

  • Saving of duplicated Prefabs at runtime is now supported

  • Register at runtime

  • Change Unique Instance ID at runtime

  • Fixed Encryption on Windows, MacOS, iOS and Android

Crystal Save – Version 1.6.41 – 26 Oct 2025

  • Fixed LoggerConfig

Crystal Save – Version 1.6.40 – 26 Oct 2025

✨ Added

  • Documentation: CRYSTALSAVE_SCENE_LOADING_INTEGRATION_API.mdScene Loading Integration API - Complete system for custom scene loaders ISceneLoadOrchestrator interface with 4 lifecycle callbacks SceneLoadOrchestratorBase abstract base class Registration system in SaveManager SceneActivationPipeline hook for delayed prefab spawning

  • Guards against SaveData corruption during prefab populationScene Loading Guard Rails - Automatic timing validation warnings ValidatePrefabPopulateTiming() method with 4 validation checks Warns about timing issues during scene loading

🔄 Changed

  • Visual update for Remember Component

🐛 Fixed

  • Critical: RememberTransform + RememberHomeScene Bug - Fixed scene GameObjects not restoring positions

  • Critical: RememberParent + RememberHomeScene Bug - Fixed parented GameObjects not restoring on scene switching

  • Minor: PrefabManager False Warning - Reduced log noise during scene switching (

  • Error: "Requesting 'prefabContentsRoot' from Awake and OnEnable is not supported"Prefab Editor Bug - Fixed InvalidOperationException when adding RememberComposite in prefab mode Wrapped IsInPrefabMode() calls in try-catch to handle Unity's timing restrictions

  • Fixed Remember Home Scene for Remember Component

Crystal Save – Version 1.6.29 – 07 Oct 2025

🔄 Changed

  • Removed Debug log spam

  • Remember Components no longer share the same Unique ID in multiple instantiated Prefabs with Remember Prefab component

  • Deferred Prefab Radius Streamer: Added Debug Visualization

Crystal Save – Version 1.6.28 – 06 Oct 2025

🐛 Fixed

  • Fixed a critical bug that occurred when adding a Remember Prefab in Prefab View to another Prefab, which automatically added a hidden UniqueID component.

  • The Inspector view of the Remember Prefab now provides a one-click fix if a UniqueID component is detected. Failing to remove this component may lead to incorrect serialization or deserialization of data.

  • Check your Prefabs both in the Scene and in the Project window.

Crystal Save – Version 1.6.27 – 04 Oct 2025

🐛 Fixed

  • Fixed Quick Save

Crystal Save – Version 1.6.26 – 04 Oct 2025

🔄 Changed

  • Remember Prefab Inspector shows now warning and Fix button when there is a Instance Unique ID referenced in the Prefab Asset.

  • Hardened SaveablePrefab.RuntimeMod, it ignores now missing scripts

Crystal Save – Version 1.6.25 – 28 Sep 2025

🔄 Changed

  • Improved support for scene-baked Remember Prefabs

  • Added a demo scene for SceneBakedRememberPrefabs

  • Moved the Live-Conflict Resolver to the Cloud Save section

  • Removed Auto-Prefab Registration from Save Settings

  • Moved the Auto-Tag Update toggle in Save Settings into the Tag Registry foldout

  • Added an Addressables page to the Save Settings Wizard

  • Updated several tooltips in Save Settings

  • Enabled most Performance Settings by default

Crystal Save – Version 1.6.24 – 26 Sep 2025

🐛 Fixed

  • Fixed StringWrapper conversion.

  • Fixed Lookup Cache not deserializing correctly on the first load.

  • Fixed Skip Saving When Unchanged on Remember Prefabs, which was falsely returning "no change" when a Remember Component serialized a change, causing the instantiated Remember Prefab not to be restored upon load.

  • Fixed Remember GameObject incorrectly destroying a GameObject when switching between scenes via LoadSceneAfterSnapshotAndPopulatePendingPrefabsAsync, then saving, and later loading the saved game.

Crystal Save – Version 1.6.23 – 23 Sep 2025

🐛 Fixed

  • Fixed RememberGameObject Deserialization

  • Fixed LegacyStringWrapper

Added

  • RememberUISlider

  • RememberUIToggle

  • Destroyed Scene GameObjects are now restored at their last location

Crystal Save – Version 1.6.22 – 22 Sep 2025

✨ Added

  • SaveablePrefab aka Remember Prefab supports now scene baked Prefabs

    • Important: When you enable Remember Home Scene for scene-baked Prefabs, make sure to set the Home Scene Mode to Last Snapshot.

🔄 Changed

  • Destroyed Scene GameObjects are now restored at their last location

Crystal Save – Version 1.6.21 – 20 Sep 2025

✨ Added

  • Deferred Remember X Component Streaming

  • Save Optimization 'Skip Saving When Unchanged' for Remember Prefab and every Remember Component

  • New Demo Scene DeferredComponentStreaming

  • Groundwork for Crystal Save's own Visual Scripting Solution

Crystal Save – Version 1.6.20 – 20 Sep 2025

Added

  • Remember X Component Streaming

  • Save Optimization 'Skip Saving When Unchanged' for Remember Prefab and every Remember Component

  • New Demo Scene DeferredComponentStreaming

  • Groundwork for Crystal Save's own Visual Scripting Solution

Crystal Save – Version 1.6.20 – 18 Sep 2025

✨ Added

  • Performance settings in Save Settings

  • Auto-pooling support for Registered Prefabs

  • Streaming of SaveablePrefabs

  • New demo scene demonstrating streaming

  • Load Priority option for Remember Prefab

  • Tracking of Blendshape Weights for children in SaveablePrefabs (no longer requires Remember SkinnedMeshRenderer for Children)

  • Snapshot feature, now used in demo scenes showing Restore SingleGameObject and RestoreDestroyedGameObject

  • Example script showing RememberGameObject retaining active state across scene switches

  • Groundwork for Adventure Creator Save Module

  • Coroutine entry point for processing deferred prefabs by instance ID, Prefab Asset ID, Reference, and Radius

🔄 Changed

  • SaveablePrefabFactory now instantiates or spawns from a pool

  • Restore Destroyed methods for SaveablePrefabs now also apply all component data

  • Applied cached scene data during scene load using snapshots, restoring GameObject active states and cleaning cache entries

  • Replaced SaveManager.DestroyWithSnapshot calls in Dispose() with a deactivate–unregister–destroy sequence, extending cleanup to pooled children

  • Supabase, Firebase, and Unity Cloud Save screenshot deletions now use 10-second timeouts and non-blocking polling to prevent workflow hangs

  • Expanded cleanup logging to report purged counts of destroyed-ID list entries

🐛 Fixed

  • Addressables integration

  • Prevented UniqueIDValidator from flagging pooled components by skipping checks under the pool root, removing duplicate ID warnings

  • Cleared DestroyedGameObjects entries for restored IDs across incoming and current save data, ensuring consistent cleanup and reactivation

Crystal Save – Version 1.6.17 – 06 Sep 2025

  • Updated SaveSlotsRuntimeUI.OnDestroy to null-check SaveManager.Instance before unsubscribing from OnSaveSlotsUpdated.

  • Improved underlying SaveSlot-Check processes

Crystal Save – Version 1.6.16 – 06 Sep 2025

  • Remember Custom Components serializes and restores now also properties

  • Added optional delay to apply serialized values

Crystal Save – Version 1.6.15 – 05 Sep 2025

Please Note: Existing Crystal Save Installation - If you do not want to delete the old installation before updating:Delete the file NamePatternResolver.cs before importing this update Create a backup of your project!

  • Added Settings Wizard

Crystal Save – Version 1.6.14 – 05 Sep 2025

Please Note: Existing Crystal Save Installation - If you do not want to delete the old installation before updating: Delete the file NamePatternResolver.cs before importing this update Create a backup of your project!

  • Fixed Performance Caching Implementation in SaveablePrefab aka Remember Prefab

Crystal Save – Version 1.6.13 – 05 Sep 2025

Please Note: Existing Crystal Save Installation: Delete the file NamePatternResolver.cs before importing this update. Create a backup of your project!

  • Ensured the SaveSlotManagerWindow re-subscribes to SaveManager events when entering Play Mode, preventing the window from stalling during initialization if it was left open before playing

  • Performance Caching in Remember Prefab and Remember GameObject is now disabled by default

Crystal Save – Version 1.6.12 – 04 Sep 2025

  • Fixed RestoreDestroyedAllGameObjects

  • Fixed newly added caching - Remember Components should now restore all data again

  • Performance Caching is now disabled by default as it can't be used in all situations

  • Fixed Race Condition in SaveSlotManagerWindow

Crystal Save – Version 1.6.11 – 03 Sep 2025

Please create backups before updating. Deleting the old installation is not required but recommended. ✨ Added

  • Metadata Import (Beta): You can now import metadata from save files created by another game that also uses Crystal Save as its backend. This enables you to extend stories across different game genres within a shared world narrative. A similar feature exists in The Witcher series, where save files can be imported from The Witcher 2 into The Witcher 3.

  • Grouped Save Slots UI: A sample Save Menu with dropdown fields.

  • Performance Settings in selected Remember Components (Beta): Components such as RememberGameObject and RememberTransform now include performance settings, improving load times by up to 30%.

  • Open Save Folder Button: Available in Save Settings.

  • File Name Patterns for Saves and Metadata: Use {meta:key} or {n} to automatically include in-game metadata in file names.

  • Slot Name Patterns.

🔄 Changed

  • WebGL Support: WebGL projects can now use encryption, compression, save file verification, and screenshots even when using Unity Cloud Save.

  • Extended Encryption: Encryption can now optionally include screenshots and metadata.

🐛 Fixed

  • The methods HasSaveAt, HasSave, HasSaveAsync, and HasSaveAtAsync now return the correct values when using Supabase as the save backend.

  • Domain Reload Issues

Known Issue: Forced Refreshes happen more frequently and may break the Save Slot Manager Window. This is affects only the Editor and not the game build.

Crystal Save – Version 1.6.10 - 28 Aug 2025

  • Save Slot Manager Window refreshes now slots after save and load

  • SaveSync and all the methods that it calls are now synchronous methods. This guarantees that the saving of the game state, metadata, and screenshots on application quit is sequentially executed and completed. (Please note: This method won't work in Cloud Save Scenarios)

  • No longer causes dead locks

Crystal Save – Version 1.6.09 - 27 Aug 2025

  • Fixed a bug in the Save Slot Manager Window where loading a saved game would show stale metadata and screenshot

  • Removed Debug Logs from Save Load UI

Crystal Save – Version 1.6.08 - 27 Aug 2025

  • Fixed Console Warning in PersistenVisbilityController - Unused Variable

Crystal Save – Version 1.6.07 - 26 Aug 2025

  • Fixed a minor bug in the PrefabManager causing the warning: Setting linear velocity of a kinematic body is not supported when using the RememberRigidbody component

  • Fixed build/rebuild button in PersistenObjectScene2

  • Fixed PersistentVisibilityController

  • Reapply at scene activation, one frame later, and again at end-of-load.

  • Force-enable states for visible scenes even if original snapshots were stale or a pool changed them.

  • Cover pooled reactivation via OnEnable.

Crystal Save – Version 1.6.06 - 26 Aug 2025

  • Removed pre-installed Settings

Crystal Save – Version 1.6.05 - 26 Aug 2025

  • Fixed script compilation error caused by new demo script SceneChanger

  • Fixed Remember Prefab vs. Remember Skinned Mesh Renderer issue: Material Swaps should now get applied correctly. Recommended: Stick to a single source of truth: Use either Remember Prefab or Remember Skinned Mesh Renderer to track Material Swaps

  • Fixed Console Obsolete Method Warnings in Unity Version 6000.3 or higher

Crystal Save – Version 1.6.04 - 26 Aug 2025

  • Fixed rare editor performance issue caused by SceneObjectIDEditor

  • Scene GameObjects with Remember Component, can now optionaly Remember their Home Scene.

  • This is a RAM-friendly alternative solution for Keep Across Scenes.

  • This feauture will only work when used with LoadSceneAfterSnapshotAndPopulatePendingPrefabsAsync" (saves the state to memory, faster (don't forget to save later)) or "LoadSceneAfterSaveAndPopulatePendingPrefabsAsync" (saves to disk immediately) instead of Unity’s own LoadScene method

  • PersistentObjectScene demonstrates this new feature (yellow spheres)

  • In Crystal Save's Save/Load UI, you can now hide save slots. You can also optionally sort Auto Saves first, followed by Quick Saves, followed by regular Saves

Crystal Save – Version 1.6.03 - 24 Aug 2025

  • HasSave & HasSaveAt check now if Save Slots are ready before returning a bool value

  • Fixed Save Buttons in Demo Scenes

  • Fixed Save Button in Save Slot Manager Window

  • Removed Debug Logs

Crystal Save – Version 1.6.02 - 23 Aug 2025

  • Added utility methods to sanitize file names and purge all local save data, removing PlayerPrefs keys, save files, metadata, and screenshots while logging the action

  • Introduced a “Wipe Local Save Data” button in the settings window that displays a confirmation dialog before triggering the wipe to prevent ghost saves

  • Ensure slot deletions trigger a full UI refresh, preserving metadata and screenshots for unaffected slots

  • Triggered a full slot refresh after completing a rename, ensuring other save slots retain screenshots and metadata when one slot is renamed

  • Exposed the runtime UI’s slot refresh routine so other components can invoke it directly after operations like renaming

  • Updated the save slot manager to avoid triggering cloud downloads when metadata and local mirrors are disabled by returning an in‑memory timestamp check instead, preventing editor hangs during save existence queries

  • Refactored save existence checks to run asynchronously, using await saveSystem.LoadAsync(slot) when cloud saves are enabled without a local mirror, and added legacy wrappers for synchronous callers

  • Introduced async slot-existence helpers (HasSaveAsync, HasSaveAtAsync, HasSaveAfterAsync, HasSaveInSceneAsync) alongside synchronous wrappers for backward compatibility

  • Exposed corresponding async methods in SaveManager so save checks can be awaited without blocking the main thread

  • Save Slot Screenshots are locked now to 16 : 9 or 9 : 16 image ratio with a max Full HD resolution. Anything larger is now cropped. WebGL Screenshots are downscaled to max 512 pixels, jpg format and jpg quality 50 to stay within the WebGL limits of the Data API.

  • Save Slot UI auto-disables Rename, Delete and Load Button for Empty Save Slots

  • Crystal Save's Save Load UI is now fully compatible with WebGL and Local Save or Unity Cloud Save

  • SaveManager's HasSave can now check if a Save File Exists even if it has no meta data.

  • Use new bool parameter hasMetaData = false if there is no meta data.

  • HasSave is now async

  • Save Load UI input field is now themeable

Crystal Save – Version 1.6.01

  • Fixed a Build Error in WebGL Build Targets

Version 1.6.0 (12 Aug 2025)

Update Notice:

  • Uninstall previous versions of Crystal Save before you import Version 1.6

OR

  • If you can not or do not want to uninstall the old version:

  • Delete ISupabaseAuthorizationResolver in Assets/Plugins/CrystalSave/Runtime/Managers/Interfaces

  • Delete the Supabase folder and its content in Assets/Plugins/CrystalSave/Runtime/ScriptableObjects/

  • Delete the SupabaseCustomFolderAuthResolver asset in Assets/Plugins/CrystalSave/Modules/Unity/Demos/Resources/

✨ Added

  • Added MySQL Save Backend support

  • Added Firebase Save Backend support

  • Added a LiveConflictResolver MonoBehaviour that compares local and remote objects at runtime, displays a Canvas overlay highlighting differing fields, and lets players accept the remote state, keep the local one, or merge field-by-field

  • Introduced a reflection-based RuntimeObjectDiffer helper to detect and apply field differences when merging conflicting objects

  • Added new conflict resolution options to save settings, including a flag to auto-resolve conflicts, a selectable policy, and optional metadata-based rules for fine-grained resolution decisions

  • Updated the settings window to expose the auto-resolve toggle, policy dropdown, and dynamic metadata rule rows with “AND” chaining support

  • Added a new conflictOverlayCanvas field in SaveSettings to let projects specify a canvas prefab for conflict-resolution overlays

  • Extended RememberMeSettingsWindow so developers can assign the overlay canvas directly in the Conflict Resolution section of the settings UI

  • Updated SaveManager to push the configured canvas to LiveConflictResolver when it initializes, enabling custom conflict-resolution UIs

  • Save Load UI: Added new OnScreenshotCaptureStarted and OnScreenshotCaptureFinished events in SaveManager with internal methods to raise them before and after screenshot capture

  • Save operations now invoke these events around screenshot capture, allowing external listeners to react to the process

  • SaveSlotsRuntimeUI and SaveSlotEntryUI subscribe to the new events and temporarily disable their canvases while screenshots are taken, hiding the UI from the captured image

  • Added an optional slot naming feature to SaveSlotsRuntimeUI, letting designers select a custom metadata key to name save slots or fall back to the scene name

  • WebGL: Added a WebGL-aware fallback in the save pipeline so that when the Cloud Save Files API returns 404, the system transparently falls back to the Data API instead of failing the save

  • Extended metadata handling to use the same Files-to-Data fallback logic, ensuring slot metadata persists even when the Files endpoint is unavailable on WebGL builds

  • Hardened screenshot cleanup so missing Cloud Save files on WebGL no longer abort the save process, logging a warning instead of throwing errors

  • Added exception handling and logging around Unity Services initialization so that failures (such as in WebGL builds) surface as explicit error messages instead of silent failures

  • Ensured Unity Cloud Save sign-in callbacks are only registered after Unity Services are successfully initialized, preventing attempts to use uninitialized services

  • Introduced a WebGL plugin based on the File System Access API, enabling asynchronous read/write, existence checks, and deletion of save files directly through the browser’s storage directory

  • Added a C# wrapper exposing the JavaScript functions to Unity, allowing binary and text file operations on WebGL builds

  • Updated the save system to leverage the new File System Access layer in WebGL, falling back to standard file APIs elsewhere

  • Ensure Unity Cloud Save is initialized after sign-in so WebGL builds can save data properly by invoking UnityCloudSaveService.Instance.InitAsync() within the cloud sign-in sequence

  • Added a WebGL-specific override in the binary cloud-save path so that WebGL builds encode data to Base64 and route saving through Unity’s Data service, avoiding CORS issues with the Files API

  • Note: Unity now synchronizes the WebGL persistent data path automatically. Crystal Save exposes a useManualSync flag in SaveSettings for legacy projects that still call FS.syncfs, but the option is deprecated and will be removed once Unity drops the API. Ensure your WebGL build's *.loader.js sets config.autoSyncPersistentDataPath = true to enable auto-sync.

  • Implemented a corresponding WebGL override for loading binary cloud saves, decoding the stored Base64 string retrieved via the Data service instead of using the Files API

  • Save Settings: Added independent configuration flags for uploading screenshots and slot metadata to cloud storage, separating what was previously a single combined option

  • Updated the settings UI to present separate “Upload Screenshots” and “Upload Slot Metadata” toggles for finer control over cloud behavior

  • Revised save system logic to remove screenshots or metadata only when their respective flags are enabled and to upload metadata based on the new setting

  • Introduced a storage path abstraction (IStoragePathProvider) and custom provider that supports a stable WebGL directory and JS flush helper for idbfs synchronization

  • Extended SaveSettings with configurable persistent path options, a migration toggle, and factory for path providers, all wired through SaveManager to run a one-time migration from legacy paths

  • Added migration utility and editor UI to preview, test, and move data between old and new locations, plus documentation on enabling a custom persistent path

  • Metadata: Enabled optional Unity Localization support for save slot metadata by conditionally referencing UnityEngine.Localization, storing LocalizedString values, and resolving them through a new GetValue helper within each entry and ToDictionary

  • Debug: Added a runtime initialization warning that logs an error when any required scripting define symbols for cloud save are missing, making symbol issues visible in development builds

  • Wrapped Unity Services initialization and authentication steps in granular try/catch blocks, logging detailed messages and stack traces for failures, and added a catch around cloud sign-in to surface errors during the login process

  • Added a general authentication warning helper so that any attempted sign‑up or sign‑in reports missing scripting define symbols

  • Introduced stub cloud‑authentication methods in SaveManager that log errors and return false when username/password sign‑up, cloud sign‑in, email login, or identity linking are attempted without the required symbols

🔄 Changed / Improved

  • Supabase: Renamed the Supabase-specific resolver to a more generic CustomFolderAuthResolver and updated its asset menu path accordingly

  • Simplified asset creation menu for the folder resolver to remove Supabase references, making it applicable to broader use cases

  • Revised CloudSaveService and the demo email auth panel to use the new CustomFolderAuthResolver name throughout the codebase

  • Introduced a new IUserAuthorizationResolver interface and added an obsolete ISupabaseAuthorizationResolver wrapper for backwards compatibility, centralizing authorization token resolution

  • Updated SaveManager and Firebase/Supabase save systems to rely on the new interface for custom authorization, ensuring consistent token handling across backends

  • Revised resolver assets to implement the new interface while still inheriting the obsolete alias, and refreshed SaveSettings guidance to reference the new name

  • Removed UserFolderResolver

🐛 Fixed

  • Sync Overlay in Save Load UI no longer freezes

Last updated