Appearance
数据与存档
先记一句话
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 当存档。