Saltar al contenido principal

ISaveSystem

Contrato para las operaciones de guardado y carga por ranura, con notificaciones de eventos.

isave system

Un guardado que falla lanza una excepción. Nunca vuelve en silencio como si hubiera funcionado, que es la forma de fallo que le hace perder la tarde a alguien.

Namespace: OpenMon.MCE.SDK

Definición​

public interface ISaveSystem
{
void Save(int slot);
void Load(int slot);
bool HasSaveData(int slot);
void DeleteSave(int slot);
event Action<int> OnSaved;
event Action<int> OnLoaded;
}
Ganchos del motor

engine.SaveSystem es un SaveSystemFacade. Save(slot) y Load(slot) solo lanzan sus eventos SaveRequested y LoadRequested, y OnSaved / OnLoaded se disparan únicamente cuando el motor llama a NotifySaved / NotifyLoaded. En el motor actual nada atiende esas solicitudes ni llama a esos ganchos, y HasSaveData(slot) / DeleteSave(slot) trabajan sobre un archivo slot{N}.sav en Application.persistentDataPath que el motor no escribe (el motor guarda carpetas con nombre dentro de Saves/; consulta la guía del sistema de guardado). Para guardados reales usa los menús del juego o, en las ediciones Source y Studio, SavegameManager.

Métodos​

Save(int slot)​

Guarda el estado actual del juego en una ranura.

ParámetroTipoDescripción
slotintÍndice de la ranura de guardado (normalmente 0-2)

Solicita guardar todas las instancias registradas de SavableObject en un archivo JSON. La persistencia real se ejecuta en el SavegameManager del motor, basado en corrutinas, así que trata la llamada como asíncrona: suscríbete a OnSaved para saber cuándo ha terminado el guardado.

Load(int slot)​

Carga el estado del juego desde una ranura.

ParámetroTipoDescripción
slotintÍndice de la ranura de guardado desde la que cargar

Deserializa el archivo JSON y aplica el estado a todas las instancias registradas de SavableObject. Puede provocar transiciones de escena si la posición guardada está en otra escena.

HasSaveData(int slot)​

Comprueba si una ranura de guardado tiene datos.

ParámetroTipoDescripción
slotintÍndice de la ranura de guardado que se comprueba

Devuelve: bool -- true si la ranura contiene datos de guardado.

DeleteSave(int slot)​

Elimina los datos de guardado de una ranura.

ParámetroTipoDescripción
slotintÍndice de la ranura de guardado que se elimina

Eventos​

OnSaved​

Se lanza después de una operación de guardado correcta.

Firma: event Action<int> OnSaved

ParámetroTipoDescripción
slotintLa ranura en la que se guardó

OnLoaded​

Se lanza después de una operación de carga correcta.

Firma: event Action<int> OnLoaded

ParámetroTipoDescripción
slotintLa ranura desde la que se cargó

Ejemplo de uso​

using OpenMon.MCE.SDK;
using Zenject;

public class SaveLoadUI : MonoBehaviour
{
// Only IMonsterCaptureEngine is bound in DI; reach subsystems through it.
[Inject] private IMonsterCaptureEngine engine;

private ISaveSystem saveSystem;

private void Awake()
{
saveSystem = engine.SaveSystem;
}

[SerializeField] private Button[] saveButtons;
[SerializeField] private Button[] loadButtons;
[SerializeField] private Button[] deleteButtons;
[SerializeField] private Text[] slotLabels;

private void Start()
{
// Update slot labels
for (int i = 0; i < 3; i++)
{
int slot = i; // Capture for closure
slotLabels[i].text = saveSystem.HasSaveData(i)
? $"Slot {i + 1}: Saved"
: $"Slot {i + 1}: Empty";

saveButtons[i].onClick.AddListener(() => saveSystem.Save(slot));
loadButtons[i].onClick.AddListener(() =>
{
if (saveSystem.HasSaveData(slot))
saveSystem.Load(slot);
});
deleteButtons[i].onClick.AddListener(() =>
{
saveSystem.DeleteSave(slot);
slotLabels[slot].text = $"Slot {slot + 1}: Empty";
});
}

// Listen for save events
saveSystem.OnSaved += (slot) =>
{
slotLabels[slot].text = $"Slot {slot + 1}: Saved";
Debug.Log($"Game saved to slot {slot + 1}");
};
}
}