mcpField
U
Unity Save System

Unity Save System

github.com/juliankerignard開発852 回インストール32 週間前に更新
リポジトリ

Unity Save System について

Unity Save System は、Unity 6+ のゲーム開発者向けにセーブシステムの実装方法を案内するスキルです。基本的な設定保存からローカルとクラウドの併用まで扱い、アトミック書き込みやデータのバージョン管理を重視します。

主な機能

  1. 01ゲーム状態のシリアライズと永続化
  2. 02アトミックなファイル書き込みとバックアップ復旧
  3. 03セーブのバージョン管理と移行
  4. 04複数スロットと自動保存
  5. 05UGS クラウドセーブと任意の暗号化

活用シーン

  1. 01Unity ゲームの進行状況保存の実装
  2. 02セーブ形式変更後のデータ移行
  3. 03一時停止やシーン変更時の自動保存

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/juliankerignard/unity-skills --skill unity-save-system

インストール後、Claude Code で/unity-save-systemを入力して読み込まれたか確認します。

同梱ファイルreferences/save-advanced.mdreferences/save-templates.md

詳細

Unity Save System

このスキルでできること

Unity 6+ 向けの完全なセーブシステムの実装を支援します。ゲーム状態のシリアライズ、アトミック書き込みによるファイル永続化、セーブデータのバージョン管理、複数スロットの管理、自動セーブ、クラウドセーブ(UGS)、オプションの暗号化を扱います。シンプルな PlayerPrefs からローカル/クラウドのハイブリッドアーキテクチャまでを対象とします。

前提条件

  • Unity 6.0+(Awaitable API)
  • 推奨:高度なシリアライズには Newtonsoft.Json(com.unity.nuget.newtonsoft-json)
  • シンプルな用途では必須の依存関係はありません(JsonUtility で十分です)

クイックスタート

  1. フォーマットを選択:JsonUtility(シンプル)または Newtonsoft.Json(ポリモーフィズム、Dictionary)
  2. 保存する各コンポーネントに ISaveable インターフェースを作成
  3. Application.persistentDataPath へのアトミック書き込みを行う SaveManager を実装
  4. 自動セーブを接続(dirty flag + timer + OnApplicationPause)
  5. EditMode テストでセーブ/ロードのサイクルをテスト(/unity-test を参照)

判断フローチャート

Que sauvegarder ?
|
+-- Preferences utilisateur (volume, langue, bindings) ?
|   +-- Peu de donnees (<1 KB) --> PlayerPrefs
|   +-- Plus structure ----------> JSON dans persistentDataPath
|
+-- Etat de jeu (progression, inventaire, position) ?
|   +-- Slot unique -----------> JSON + ISaveable pattern
|   +-- Multi-slots -----------> SaveManager avec index + slots nommes
|   +-- Donnees volumineuses (>10 MB) --> Format binaire (MemoryPack/MessagePack)
|
+-- Cloud sync ?
|   +-- Unity Gaming Services --> UGS Cloud Save
|   +-- Cross-platform natif --> Platform Toolkit (Unity 6.3+)
|   +-- Hybride (local + cloud) -> ISaveStorage abstraction (voir `references/save-advanced.md`)
|
+-- Sensible (anti-cheat) ?
    +-- Encryption AES + hash d'integrite (voir `references/save-advanced.md`)

ステップごとのガイド

ステップ 1 — シリアライズ形式を選択する
基準JsonUtilityNewtonsoft.JsonMemoryPackMessagePack
セットアップUnity に含まれるUnity パッケージNuGetNuGet
ポリモーフィズムいいえはい(TypeNameHandling)はいはい
Dictionaryいいえはいはいはい
可読性JSONJSONバイナリバイナリ
パフォーマンス高速中程度非常に高速高速
サイズ中程度中程度小さい小さい
推奨用途プロトタイピングデフォルトで推奨10 MB を超えるデータバイナリ形式の代替
ステップ 2 — ISaveable と SaveData を作成する
  • ISaveable を定義します:SaveKey、CaptureState()、RestoreState(object)
  • version フィールド、Dictionary<string, object>、メタデータを含む SaveData を作成します
  • 完全なコード(ISaveable、SaveData、SaveManager)は references/save-templates.md を参照してください
ステップ 3 — SaveManager を実装する
  • シングルトンまたはサービスロケータのパターンを使用します(/unity のアーキテクチャを参照)
  • ISaveable のレジストリ(Register/Unregister)
  • SaveAsync:すべての状態をキャプチャ -> シリアライズ -> アトミック書き込み(.tmp -> .save、.bak)
  • LoadAsync:ファイルを読み込む -> デシリアライズ -> すべての状態を復元
  • パス:Path.Combine(Application.persistentDataPath, "saves", slotName + ".save")
ステップ 4 — 自動セーブ
  • Dirty flag:各 ISaveable が変更を通知します
  • 設定可能なタイマー(デフォルトは 60~120 秒)
  • OnApplicationPause(true) とシーン変更時にセーブします
  • 自動セーブについては references/save-advanced.md のセクション「Auto-Save」を参照してください
ステップ 5 — セーブ/ロードのサイクルをテストする
  • EditMode テスト:セーブ -> 状態をクリア -> ロード -> 状態が復元されたことをアサート
  • 破損テスト:切り詰められたファイルをロード -> .bak へのフォールバックを確認
  • 移行テスト:v2 のコードで v1 のセーブをロード

厳守事項

必ず行うこと
  • 必ずアトミック書き込みを使用します(.tmp に書き込み、rename し、.bak を保持)
  • 必ず SaveData のバージョンを管理します(スキーマが変更されるたびに version フィールドを増やします)
  • 必ず Application.persistentDataPath を使用します(dataPath や streamingAssetsPath は使用しません)
  • 必ずモバイルでは OnApplicationPause(true) 時にセーブします
  • 必ず POCO(Plain Old C# Objects)をシリアライズします — Unity の型は使用しません
  • 必ず「セーブデータがない」場合(初回起動)に対処します
絶対に行わないこと
  • 絶対に BinaryFormatter を使用しません — 既知のセキュリティ上の脆弱性があり、非推奨です
  • 絶対に MonoBehaviour、GameObject、ScriptableObject の参照をセーブデータに保存しません
  • 絶対に 100 KB を超えるファイルをメインスレッドで同期的にセーブしません
  • 絶対に新しいファイルの書き込みが完了する前に古いファイルを削除しません(クラッシュ時に確実に破損します)
  • 絶対に I/O 例外を無視しません — 必ず try/catch とフォールバックを実装します

関連スキル

  • /unity-code-gen — ISaveable と SaveManager のボイラープレートを生成する
  • /unity-test — 保存/読み込みサイクルを検証する EditMode テスト
  • /unity-debug — デシリアライズの問題を診断する
  • /addressables — アセット参照を address 文字列で保存する

トラブルシューティング

問題考えられる原因解決策
読み込み時の FileNotFoundException初回起動で、セーブデータがない読み込み前に File.Exists() を確認し、デフォルトデータを返す
アップデート後にデータが失われるスキーマの変更にマイグレーションがないversion フィールドと、v1->v2->vN のマイグレーション処理を追加する
JsonSerializationExceptionポリモーフィック型が認識されないNewtonsoft:TypeNameHandling.Auto とカスタム SerializationBinder を使用する
セーブデータが破損している(JSON が途中で切れている)書き込み中にクラッシュしたアトミック書き込み(.tmp -> rename)と .bak へのフォールバックを行う
UnauthorizedAccessException許可されていないパス(Android のスコープ)persistentDataPath のみを使用する
PlayerPrefs が消える(iOS)システムによるクリーンアップ、または再インストール重要なデータはファイルに移行する
セーブデータが大きすぎる(>50 MB)大量のデータを JSON にシリアライズしているMemoryPack/MessagePack に切り替え、圧縮(GZip)する
クラウド/ローカル間で同期がずれるバージョンの競合競合解決(タイムスタンプまたはバージョンカウンター)を実装する

コメント