unity-data-persistence について
unity-data-persistence は、DTO のデータバインディングを軸にした Unity のセーブ/ロードシステムです。ゲーム開発者向けに、エンティティの状態とセーブデータを結び付け、シリアライザーや保存サービスを交換できる構成を提供します。
主な機能
- 01エンティティを DTO に直接バインド
- 02GameData の保存と読み込み
- 03安定した SerializableGuid 識別子
- 04保存先とシリアライザーの交換
- 05複数エンティティのリストをバインド
活用シーン
- 01プレイヤーやインベントリの状態を保存
- 02セーブデータからシーン内のエンティティを復元
- 03フラットな GameData フィールドから開始
- 04ローカル JSON 保存を別のバックエンドに変更
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ muharremtozan/ unity-agent-skills --skill unity-data-persistenceインストール後、Claude Code で/unity-data-persistenceを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/code/FileDataService.cs.txtPersistenceCore.cs.txtSaveLoadManager.cs.txtSaveLoadSystem.cs.txtreferences/guide.md詳細
Unity Data Persistence
データバインディングを基盤とする、プロフェッショナルなセーブ/ロードシステムを実装します。セーブ可能なオブジェクトは常に最新の状態を保つ DTO へのライブ参照を保持するため、シリアライズはほぼ瞬時に完了し、バックエンドにも依存しません。
adammyhre/Unity-Inventory-System に着想を得ています。
コアアーキテクチャ
SaveLoadSystem
├── IDataService (FileDataService by default)
│ └── ISerializer (JsonSerializer by default)
└── GameData (your root DTO)
├── PlayerData (ISaveable) ←─ Hero.Bind()
└── InventoryData (ISaveable) ←─ Inventory.Bind()
主な機能
- データバインディングパターン:MonoBehaviour は自身の DTO への参照を保持するため、セーブでは GameData をシリアライズするだけです。ポーリングやプロパティの走査は不要です。
- IBind<T> / ISaveable:シーンのエンティティとセーブデータを、シーンのロード時に接続する 2 つのインターフェースです。
- SerializableGuid:保存データと生成されたエンティティを照合するための、安定かつ高速な GUID 識別子(int ベースの比較)です。
- バックエンドの切り替え:
IDataService+ISerializerにより、1 行変更するだけでローカルの JSON からクラウド/バイナリに切り替えられます。 - 複数エンティティのバインディング:リストベースの
Bind<T, TData>(List<TData>)で、複数のエンティティを扱うシナリオ(敵、スポーナー)に対応します。
コアファイル(最大 3 つ)
PersistenceCore.cs.txt—ISerializer、JsonSerializer、IDataService、ISaveable、IBind<T>、SerializableGuidFileDataService.cs.txt— ローカルディスクの実装:Save、Load、Delete、DeleteAll、ListSavesSaveLoadSystem.cs.txt—Bind<T,TData>()と、公開 API の Save/Load/New を備えた永続的な MonoBehaviour オーケストレーター
使用方法
クイックスタート(ライトパス — バインディング不要)
// 1. Extend GameData with your fields
[Serializable] public class GameData {
public string Name;
public int Score;
}
// 2. Save / Load
SaveLoadSystem.Instance.gameData.Score = 100;
SaveLoadSystem.Instance.SaveGame();
SaveLoadSystem.Instance.LoadGame("MySave");
フルシステム(プロパス — データバインディング)
// 1. Create a DTO
[Serializable] public class PlayerData : ISaveable {
[field: SerializeField] public SerializableGuid Id { get; set; }
public Vector3 position;
}
// 2. Implement IBind on your MonoBehaviour
public class PlayerEntity : MonoBehaviour, IBind<PlayerData> {
[SerializeField] SerializableGuid id;
PlayerData data;
public SerializableGuid Id { get => id; set => id = value; }
public void Bind (PlayerData d) { data = d; data.Id = id; transform.position = d.position; }
void Update () { data.position = transform.position; } // write-through
}
// 3. Register in SaveLoadSystem.OnSceneLoaded
Bind<PlayerEntity, PlayerData>(gameData.playerData);
複数エンティティのバインディングやバックエンドの切り替えを含む完全な例については、references/guide.md を参照してください。
重要な原則
まずデータモデルを設計します。DTO の構造が、そのままセーブ形式になります。シンプルな形(フラットなフィールドを持つ GameData)から始め、エンティティが個別に復元可能な状態を必要とする場合にのみ、バインディングを追加します。
コメント
Markdown 対応