Changelog
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