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