Перейти к основному содержимому

ISaveSystem

Контракт для операций сохранения/загрузки по слотам, с уведомлениями о событиях.

isave system

Неудачное сохранение вызывает исключение. Оно никогда не возвращается молча, будто всё получилось: именно такой сбой отнимает у человека целый день.

Пространство имён: OpenMon.MCE.SDK

Определение​

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 — это SaveSystemFacade. Save(slot) и Load(slot) лишь вызывают его события SaveRequested и LoadRequested, а OnSaved / OnLoaded срабатывают только тогда, когда движок вызывает NotifySaved / NotifyLoaded. В текущем движке эти запросы никто не обрабатывает и эти хуки никто не вызывает, а HasSaveData(slot) / DeleteSave(slot) работают с файлом slot{N}.sav в Application.persistentDataPath, который движок не записывает (движок сохраняет именованные папки в Saves/, см. руководство по системе сохранений). Для настоящих сохранений используйте внутриигровые меню или, в редакциях Source и Studio, SavegameManager.

Методы​

Save(int slot)​

Сохраняет текущее состояние игры в слот.

ПараметрТипОписание
slotintИндекс слота сохранения (обычно 0-2)

Запрашивает сохранение всех зарегистрированных экземпляров SavableObject в файл JSON. Фактическая запись выполняется в основанном на корутинах SavegameManager движка, поэтому считайте вызов асинхронным: подпишитесь на OnSaved, чтобы узнать, когда сохранение завершилось.

Load(int slot)​

Загружает состояние игры из слота.

ПараметрТипОписание
slotintИндекс слота сохранения, из которого загружать

Десериализует файл JSON и применяет состояние ко всем зарегистрированным экземплярам SavableObject. Может вызвать переходы между сценами, если сохранённая позиция находится в другой сцене.

HasSaveData(int slot)​

Проверяет, есть ли в слоте сохранения данные.

ПараметрТипОписание
slotintИндекс проверяемого слота сохранения

Возвращает: bool -- true, если в слоте есть данные сохранения.

DeleteSave(int slot)​

Удаляет данные сохранения из слота.

ПараметрТипОписание
slotintИндекс удаляемого слота сохранения

События​

OnSaved​

Вызывается после успешной операции сохранения.

Сигнатура: event Action<int> OnSaved

ПараметрТипОписание
slotintСлот, в который выполнено сохранение

OnLoaded​

Вызывается после успешной операции загрузки.

Сигнатура: event Action<int> OnLoaded

ПараметрТипОписание
slotintСлот, из которого выполнена загрузка

Пример использования​

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}");
};
}
}