Guardado de Partidas y Progreso
Slots de guardado con secciones extensibles para el estado de cada partida, y un agregado de progreso global aparte para todo lo que debe sobrevivir al borrado de un guardado.
Para qué sirve este sistema
La mayoría de los sistemas de guardado en Unity mezclan dos preguntas distintas: «qué ha pasado en esta partida» y «qué ha desbloqueado este jugador a lo largo del tiempo». El resultado son juegos donde borrar un slot se lleva por delante logros que deberían haber sobrevivido, o contadores de finalización metidos en el mismo archivo de guardado que se reinician con él.
Serenity responde a las dos preguntas con dos agregados en lugar de uno. GameSave guarda el estado de cada partida en un número configurable de slots, cada uno con un documento extensible que define tu juego. GameProgress guarda todo lo que es global e independiente del slot — contadores de finalización, extras desbloqueados — de modo que borrar una partida guardada nunca borra lo que el jugador se ha ganado.
El problema en Unity
Un sistema de guardado improvisado tiende a serializarlo «todo» en un único blob por slot, incluidos datos que no pertenecen a esa partida concreta. Borrar un slot elimina entonces un progreso que debería ser permanente, y cada nuevo dato que guardar — inventario, hitos, porcentaje de finalización — obliga a editar un serializador hecho a mano en lugar de registrar una sección nueva.
Los menús de slots que muestran etiqueta, fecha y porcentaje de finalización suelen tener que deserializar el archivo completo solo para leer tres campos, y eso se vuelve más lento a medida que crecen las partidas. Y sin escrituras atómicas, un guardado interrumpido a medias o una caché en memoria desactualizada tras un reinicio pueden perder en silencio el progreso más reciente del jugador.
Cómo lo aborda Serenity
GameSave da a cada slot un SaveDocument compuesto de secciones tipadas. Tu juego lo extiende implementando ISaveSection — SectionKey, Serialize y Deserialize — y Serenity incluye de serie InventorySection, MilestonesSection y CompletionSection. El porcentaje de finalización y el tiempo de juego se promocionan a columnas consultables, de modo que un menú de slots muestra etiqueta, fecha y finalización sin deserializar el documento completo. Cada escritura es un upsert atómico por slot con semántica de «la última gana» y reconciliación de ticks cuando la caché está fría, así que un guardado nunca se pierde en silencio tras reiniciar la aplicación.
GameProgress es un agregado aparte, de una sola fila, expuesto a través de IGameProgressService — IncrementCompletionCount, UnlockExtra, IsExtraUnlocked, GetUnlockedExtras y un payload JSON libre para cualquier otra cosa que tu juego necesite registrar de forma global. Persiste al margen de los slots de guardado, así que borrar uno nunca lo afecta. Los guardados rápidos de Checkpoint viajan dentro del slot activo a través de CheckpointsSection, activado por defecto y con la API pública de Checkpoint intacta.
Cómo encaja en Serenity
Los dos agregados persisten a través del mismo backend estructurado intercambiable que estrenó Leaderboard — PlayerPrefs, JSON con LocalFile, SQLite embebido, HTTP o una conexión directa a Postgres, MySQL o MongoDB — configurado en UnityGameSaveSettings y UnityGameProgressSettings. Elegir un backend en la nube para los guardados no cuesta ni una línea de código de aplicación: es un cambio de configuración.
GameSave publica un conjunto completo de señales — GameSavedSignal, GameLoadedSignal, SaveSlotDeletedSignal — junto con pares señal/acción sin código como RequestSaveGameSignal/SaveGameAction, RequestLoadGameSignal/LoadGameAction y ShowSaveSlotMenuSignal/ShowSaveSlotMenuAction, de modo que los menús pueden pedir un guardado o una carga sin una línea de C#. Dos asistentes, Create Game Save Settings y Create Game Progress Settings, configuran slots, secciones y backend de una sola vez.
Flujo de trabajo práctico
- Implementa ISaveSection para los datos propios que tu juego guarda por partida, además de las secciones de serie InventorySection, MilestonesSection y CompletionSection.
- Configura el número de slots y el backend de persistencia en UnityGameSaveSettings, o ejecuta el asistente Create Game Save Settings para hacerlo guiado.
- Pide un guardado o una carga emitiendo RequestSaveGameSignal o RequestLoadGameSignal — sin llamar al servicio desde el código de interfaz.
- Construye el menú de slots a partir de las columnas consultables de etiqueta, fecha y finalización, sin deserializar partidas completas.
- Configura IGameProgressService con UnityGameProgressSettings o su asistente para registrar contadores de finalización y extras desbloqueados al margen de los slots.
- Activa RouteCheckpointsIntoActiveSlot para que los guardados rápidos de Checkpoint viajen automáticamente con el slot activo.
Qué incluye
- Agregado GameSave con SlotCount configurable y un SaveDocument extensible por slot
- Punto de extensión ISaveSection, con InventorySection, MilestonesSection y CompletionSection de serie
- Porcentaje de finalización y tiempo de juego como columnas consultables para los menús de slots
- Upsert atómico por slot con semántica de «la última gana» y reconciliación de ticks con caché fría
- Agregado GameProgress con IGameProgressService — IncrementCompletionCount, UnlockExtra, IsExtraUnlocked, GetUnlockedExtras
- CheckpointsSection, que dirige los guardados rápidos de Checkpoint al slot activo, activado por defecto
- Conjunto completo de señales y pares señal/acción sin código para guardar, cargar y abrir el menú de slots
- Backend de persistencia intercambiable compartido con Leaderboard — guardado en la nube sin código adicional
Cuándo usarlo
- Juegos que necesitan varios slots de guardado con inventario, hitos o datos de finalización sin construir un serializador a mano.
- Proyectos donde los desbloqueos globales o los contadores de finalización deben sobrevivir al borrado de un slot.
- Menús de slots que muestran etiqueta, fecha y finalización al instante, sin deserializar cada partida guardada.
- Equipos que ya usan Checkpoint y Persistencia y quieren guardados rápidos y almacenamiento en la nube sin cableado adicional.
Sistemas relacionados
Usa Serenity cuando quieras que las partidas guardadas y el progreso permanente del jugador sean dos responsabilidades bien separadas, las dos sobre un almacenamiento que puedes cambiar sin tocar el código del juego.
English
Español
Català