Sistema de guardado
MCE usa un sistema de guardado basado en JSON con guardados por ranuras, versionado y extensibilidad. El sistema de guardado persiste el estado completo del juego del jugador: equipo, inventario, posicion, medallas, progreso de misiones y variables del juego.
Arquitectura
El sistema de guardado esta compuesto por varios componentes:
| Componente | Proposito |
|---|---|
SavegameManager | Orquesta las operaciones de guardado/carga |
SavableObject | Clase base para cualquier objeto que necesita persistir datos |
MCESavesSerializer | Maneja la serializacion y deserializacion JSON |
GameVariables | Almacen global de variables (booleanos, enteros, cadenas) |
GameVariable | Referencia a variable individual |
GameVariableHolder | Wrapper MonoBehaviour para variables del juego |
SavegameInstaller | Installer de Zenject para el sistema de guardado |
SavableGlobalGameData
El contenedor principal de datos de guardado es SavableGlobalGameData (un componente en el GameObject GlobalGameData). Almacena:
| Dato | Descripcion |
|---|---|
| Posicion del jugador | Escena actual, coordenadas de tile, direccion |
| Equipo de monstruos | Todos los monstruos del equipo con estado completo (especie, nivel, IVs, EVs, naturaleza, movimientos, PP, HP, estado, amistad, etc.) |
| Almacenamiento PC | Monstruos almacenados en cajas |
| Mochila | Todos los objetos y cantidades |
| Dinero | Moneda del jugador |
| Medallas | Medallas de gimnasio obtenidas |
| MonsterDex | Seguimiento de vistos/capturados por especie |
| Variables del juego | Todos los valores de GameVariable (usados por CommandGraph) |
| Progreso de misiones | Misiones activas, objetivos completados, recompensas reclamadas |
| Tiempo de juego | Tiempo total de juego |
Ranuras de guardado
MCE soporta multiples ranuras de guardado. La configuracion predeterminada proporciona 3 ranuras, pero es configurable.
Guardar
// Through the SDK (all tiers)
engine.SaveSystem.Save(slotIndex); // 0, 1, or 2
// Or through the SavegameManager directly (Source tier)
savegameManager.Save(slotIndex);
Cargar
// Through the SDK (all tiers)
engine.SaveSystem.Load(slotIndex);
// Check if slot has data first
if (engine.SaveSystem.HasSaveData(slotIndex))
{
engine.SaveSystem.Load(slotIndex);
}
Eliminar
engine.SaveSystem.DeleteSave(slotIndex);
Ubicacion de archivos de guardado
Los archivos de guardado se almacenan usando Application.persistentDataPath de Unity:
| Plataforma | Ruta |
|---|---|
| Windows | %USERPROFILE%/AppData/LocalLow/<CompanyName>/<ProductName>/ |
| macOS | ~/Library/Application Support/<CompanyName>/<ProductName>/ |
| Linux | ~/.config/unity3d/<CompanyName>/<ProductName>/ |
| Android | Almacenamiento interno (privado de la app) |
| iOS | Sandbox de la app |
Cada ranura se guarda como un archivo JSON separado: save_0.json, save_1.json, save_2.json.
Versionado de guardado
MCE incluye versionado de guardado para manejar actualizaciones entre versiones del juego:
- Cada archivo de guardado incluye un numero de version.
- Al cargar un guardado antiguo, el
MCESavesSerializeraplica pasos de migracion para actualizar la estructura de datos. - Esto previene la corrupcion de guardado cuando se anaden nuevos campos o se cambian formatos de datos entre actualizaciones.
Nunca renombre campos serializados en clases relacionadas con guardado sin proporcionar una migracion. Si renombra un campo, los archivos de guardado existentes perderan esos datos al cargar. Use [FormerlySerializedAs("oldName")] para renombrar campos.
GameVariables
El sistema GameVariables es el almacen de estado global de MCE. Persiste datos clave-valor arbitrarios que pueden leerse y escribirse desde nodos de CommandGraph, scripts y archivos de guardado.
Tipos de variables
| Tipo | Descripcion | Ejemplo |
|---|---|---|
| Boolean | Banderas verdadero/falso | "defeatedBrock" = true |
| Integer | Contadores numericos | "fishCaught" = 42 |
| String | Valores de texto | "rivalName" = "Gary" |
Uso en CommandGraph
- Nodo SetVariable: Establecer el valor de una variable.
- Nodo BranchOnVariable: Verificar una variable y ramificar.
- Nodo AddToVariable: Incrementar una variable numerica.
Uso en codigo
// Read a variable
bool hasBadge = GameVariables.GetBool("defeatedBrock");
int fishCount = GameVariables.GetInt("fishCaught");
// Write a variable
GameVariables.SetBool("defeatedBrock", true);
GameVariables.SetInt("fishCaught", fishCount + 1);