关于 unity-data-persistence
unity-data-persistence 是一套以 DTO 数据绑定为核心的 Unity 存档与加载系统,面向需要将游戏实体状态关联到存档数据的开发者,并支持替换序列化器和存储服务。
主要功能
- 01将实体直接绑定到 DTO
- 02保存和加载 GameData
- 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 数据持久化
构建专业的保存/加载系统,以数据绑定为核心:可保存对象持有对 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:两个接口,可在场景加载时将场景实体与其保存数据关联起来。
- SerializableGuid:稳定、快速的 GUID 标识(基于 int 的比较),用于将已保存的数据与生成的实体匹配。
- 可替换后端:
IDataService+ISerializer让你只需改一行代码,就能从本地 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— 持久化 MonoBehaviour 协调器,提供Bind<T,TData>()以及公开的 Save/Load/New API
用法
快速入门(轻量路径——无需绑定)
// 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