beasty-save-system / changelog.md
Historial de cambios
Todos los cambios relevantes de Beasty Save System. Este proyecto sigue Semantic Versioning.
1.1.0 — 6 de agosto de 2026
Añadido
- Backends de almacenamiento conectables: los guardados pueden ir a una base de datos en vez de a un
archivo local. Los archivos locales siguen siendo el valor por defecto y no cambian; un backend
propio implementa
IBeastySaveStorage. - Módulos de Firebase — Firestore (
firestore), Realtime Database (realtime-db) e inicio de sesión anónimo automático — que solo se compilan si el SDK de Firebase está presente. Los guardados se almacenan por usuario. - El editor mantiene los scripting defines
BEASTY_HAS_FIREBASE_*sincronizados automáticamente según el SDK de Firebase aparece o desaparece del proyecto. - Costura de identidad de usuario:
IBeastyUserProvider/BeastySaveUsersdeciden de quién son los guardados;ScopeByUsertambién separa los archivos locales por usuario. - JSON sin archivos:
BeastySave.SaveToJson/LoadFromJsonyToJson/FromJson, para endpoints propios. SaveResult<T>: un resultado tipado que lleva un valor, devuelto por las API de JSON y de lectura.- Utilidades asíncronas de ranura:
ExistsAsync,DeleteAsync,ListSlotsAsync,ReadMetaAsync,RestoreBackupAsync,SaveAllNowAsync/LoadAllNowAsync. - Errores tipados nuevos:
BackendRequiresAsync,BackendUnavailable,AuthRequired,NetworkError. - Save Mode en el Beasty Save Manager: Synchronous (por defecto) o Asynchronous para los puntos de entrada pensados para UnityEvent. Los backends en la nube siempre operan de forma asíncrona.
- Un inspector de verdad para el Beasty Save Manager: tarjeta de estado, las decisiones de Storage y Save Mode delante, y todo lo demás tras un desplegable de ajustes avanzados.
- La ventana Save Manager agrupa cada ajuste por su papel (Backend, Location, Security, Reliability, Versioning, Logging), con ayuda contextual.
- Diagnóstico de cargas en el nivel Verbose; una carga que no aplica nada ahora avisa en vez de terminar bien en silencio.
- Firestore: un documento de cabecera sin un recuento de fragmentos válido falla como dato corrupto tipado, y el nivel Verbose dice si una instantánea vino del servidor o de la caché sin conexión.
- Suite de pruebas de Firebase en vivo, que solo se compila si el SDK de Firebase está instalado.
Cambiado
- El mensaje de error de carga por archivo no encontrado nombra la ranura en vez de la ruta del archivo.
BeastySave.GetFolderPath/GetSlotPathsiguen describiendo solo la disposición de archivos locales.BeastySaveManager.SaveAll/LoadAll/DeleteSlotderivan a la vía asíncrona automáticamente en backends solo asíncronos.
Corregido
- Con el asset Beasty Console presente,
BeastySaveLog.Warningaparece como una advertencia de consola de verdad. - La etiqueta de estado del objeto de la demo está conectada a los eventos de guardado y carga, así que un fallo en la escena de demo se informa a sí mismo.
Compatibilidad
- Compila sin advertencias en todas las generaciones de Unity 6, incluida la 6.5, que deprecó APIs que usaban los conversores y las búsquedas de escena; los guardados escritos por versiones anteriores siguen cargando a través de esos cambios.
1.0.0 — 27 de julio de 2026
Primera versión pública.
Núcleo
- Guardado y carga por ranuras, síncronos y esperables con await, con un objeto de resultado que devuelve cada llamada.
- Motor JSON propio: sin Newtonsoft, sin dependencias externas.
- Escrituras atómicas (archivo temporal + intercambio): un cierre inesperado a mitad de escritura no puede dejar una ranura a medias.
- Copias de seguridad
.bakpor ranura, y recuperación desde ellas cuando una ranura se daña; una ranura corrupta nunca entra en la rotación de copias. - Los nombres de ranura se validan: separadores de ruta,
.., rutas absolutas y nombres de dispositivo reservados vuelven comoInvalidArgumenten vez de escribir fuera de la carpeta de guardado. - Cifrado AES-256 opcional. Ofuscación, no seguridad real: la clave viaja con el juego.
Logging
- Un desplegable Logging en
BeastySaveManager:Auto,On,Verbose,Off. - Guardados, cargas, borrados, restauraciones y migraciones lo dicen, con tamaño y tiempos; sondear una ranura vacía queda en silencio.
- Una ranura que falla su checksum y queda fuera de la rotación de copias avisa.
SaveResult.BytesWrittenyLoadResult.MigratedFrom, para tu propia interfaz.- Un solo logger,
BeastySaveLog, con un destino conectable. - Los logs aterrizan en la ventana de Beasty Console cuando ese asset está en el proyecto (detectado por reflexión), y en la consola de Unity cuando no.
Estado de escena
BeastySaveable: captura los componentes que marques en un objeto — objetos inactivos y componentes repetidos del mismo tipo incluidos.- Objetos creados en ejecución:
BeastySaveManager.Registerfija el id bajo el que se archivan sus datos. - La carga estricta es todo o nada en la escena entera; la carga tolerante salta el campo conflictivo y conserva el resto.
- Un valor almacenado con el tipo equivocado se informa, nunca se sustituye en silencio por el valor vivo.
- Módulos conversores (audio, uGUI, partículas, animación), cada uno condicionado al módulo de Unity
que necesita. Restaurar un
Slidero unToggleno disparaonValueChanged.
Editor
- El ensamblado de pruebas interno solo se compila con el scripting define
BEASTY_DEV_TOOLS.
Plataformas
- Mono e IL2CPP (las rutas de reflexión que las builds AOT suelen romper están cubiertas por una escena de prueba).