ISaveSystem
Contrato para las operaciones de guardado y carga por ranura, con notificaciones de eventos.
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;
}
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ámetro | Tipo | Descripción |
|---|---|---|
slot | int | Í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ámetro | Tipo | Descripción |
|---|---|---|
slot | int | Í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ámetro | Tipo | Descripción |
|---|---|---|
slot | int | Í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ámetro | Tipo | Descripción |
|---|---|---|
slot | int | Í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ámetro | Tipo | Descripción |
|---|---|---|
slot | int | La ranura en la que se guardó |
OnLoaded
Se lanza después de una operación de carga correcta.
Firma: event Action<int> OnLoaded
| Parámetro | Tipo | Descripción |
|---|---|---|
slot | int | La 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}");
};
}
}