メインコンテンツまでスキップ

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) は、Application.persistentDataPath にある slot{N}.sav ファイルを対象に動作しますが、エンジンはこのファイルを書き込みません(エンジンは 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}");
};
}
}