Skip to content

数据与存档

unity-data-save-system

先记一句话

c
存档 = 从游戏对象提取纯数据 + 转成 JSON + 写入 persistentDataPath

读档则反过来:

c
读取 JSON + 转回 SaveData + 应用回游戏对象

三类数据一定要分清

类型是什么例子常见做法
配置数据设计时就定好的规则武器伤害、怪物血量、关卡奖励ScriptableObject / JSON / 表格
运行时数据游戏中正在变化的状态血量、金币、位置、背包内存里的对象字段
存档数据准备写进文件的纯数据等级、金币、物品 ID、任务进度SaveData + JSON 文件

PlayerPrefs 用来干什么

PlayerPrefs 适合保存小设置:

c
音量
画质
语言
是否开启震动
新手引导是否完成

它不适合保存复杂进度,比如完整背包、任务系统、地图状态。 而且 Unity 官方文档也说明 PlayerPrefs 本地存储 不加密,敏感数据不要放进去。

JSON 文件适合保存什么

单机游戏主存档,建议用 JSON 文件:

c
玩家等级
金币
当前位置
背包物品 ID 列表
任务进度
已解锁关卡
设置快照

最小思路:

c
using System.IO;
using UnityEngine;

string path = Path.Combine(Application.persistentDataPath, "save.json");

public void Save(SaveData data)
{
    string json = JsonUtility.ToJson(data, true);
    File.WriteAllText(path, json);
}

public SaveData Load()
{
    string json = File.ReadAllText(path);
    return JsonUtility.FromJson<SaveData>(json);
}

SaveData 应该保存什么

推荐保存“值”和“ID”:

c
[System.Serializable]
public class SaveData
{
    public int version = 1;
    public int level;
    public int coins;
    public Vector3Data playerPosition;
    public List<string> itemIds;
}

不要直接保存:

c
public GameObject player;
public Transform spawnPoint;
public MonoBehaviour questManager;

正确做法是保存:

c
playerPosition
spawnPointId
questId
itemId
weaponId

读档时再根据这些 ID 找回配置或场景对象。

ScriptableObject 怎么用

ScriptableObject 很适合做配置数据:

c
WeaponConfig
EnemyConfig
SkillConfig
LevelConfig
ShopItemConfig

比如一把剑的基础攻击力、图标、价格,可以放在 ScriptableObject 里。 但玩家当前有没有这把剑、强化到几级、耐久是多少,应该放进 SaveData,而不是直接改 ScriptableObject 当存档。

官方参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0