Unity PlayerPrefs
何为 PlayerPrefs
在Unity ScriptableObject 一文中我们提及了SO可以搭配PlayerPrefs来进行变更数据的持久化,那么什么是PlayerPrefs呢?
PlayerPrefs 是 Unity 提供的一个轻量级本地数据存储系统,用于在游戏运行时保存和读取玩家的偏好设置。它本质上是一个键值对(Key-Value)存储,数据会持久化保存在玩家设备的本地文件中。
PlayerPrefs 的数据存储在哪里?
| 平台 |
存储路径 |
| Windows |
HKEY_CURRENT_USERSoftware[公司名][项目名](注册表) |
| macOS |
~/Library/Preferences/[公司名]/[项目名].plist |
| Linux |
~/.config/[公司名]/[项目名].prf |
| Android |
/data/data/[包名]/shared_prefs/[项目名].xml |
| iOS |
/Library/Preferences/[包名].plist |
| WebGL |
浏览器本地存储(LocalStorage) |
PlayerPrefs 的基本API
写入数据
// 保存整数
PlayerPrefs.SetInt("Score", 100);
// 保存浮点数
PlayerPrefs.SetFloat("Volume", 0.8f);
// 保存字符串
PlayerPrefs.SetString("PlayerName", "张三");
// 立即写入磁盘(可选,不调用也会在游戏退出时自动保存)
PlayerPrefs.Save();
读取数据
// 读取整数(如果不存在,返回默认值 0)
int score = PlayerPrefs.GetInt("Score");
// 读取浮点数(如果不存在,返回默认值 0.0f)
float volume = PlayerPrefs.GetFloat("Volume");
// 读取字符串(如果不存在,返回空字符串 "")
string name = PlayerPrefs.GetString("PlayerName");
// 带默认值的读取(推荐!)
int score = PlayerPrefs.GetInt("Score", 50); // 不存在时返回 50
float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
string name = PlayerPrefs.GetString("PlayerName", "默认玩家");
检查与删除
// 检查某个键是否存在
if (PlayerPrefs.HasKey("Score"))
{
// 存在则读取
int score = PlayerPrefs.GetInt("Score");
}
// 删除单个键
PlayerPrefs.DeleteKey("Score");
// 删除所有数据
PlayerPrefs.DeleteAll();
实际应用场景 & 使用
- 保存游戏设置(推荐配合ScriptableObject来使用哦):用SO作为运行时内存数据,方便各系统引用、PlayerPrefs作为持久化存储,负责保存和加载;
- 保存游戏进度、存档、删档;
- 不需要每次 Set 后都调用 Save(),会降低性能,而是在保存所有数据后统一调用一次即可。
注意事项 与 局限性
| 问题 |
说明 |
| 数据量限制 |
不适合存储大量数据(如几十 MB 的存档),建议用文件系统或数据库 |
| 安全性 |
数据以明文存储,玩家可以手动修改(不适用于防作弊) |
| 类型限制 |
只支持 int、float、string 三种类型 |
| 平台差异 |
不同平台的存储位置不同,但 API 统一,无需额外处理 |
| 同步写入 |
Set 操作是异步的,调用 Save() 可强制立即写入磁盘 |
| WebGL 限制 |
受浏览器存储限制(通常 5-10 MB) |
PlayerPrefs VS 其他存储方案
| 存储方式 |
适用场景 |
数据大小 |
安全性 |
| PlayerPrefs |
用户设置、简单存档 |
小(KB 级别) |
低(明文) |
| JSON / XML 文件 |
复杂存档、关卡数据 |
中(MB 级别) |
低(可被修改) |
| SQLite 数据库 |
大量结构化数据 |
大(GB 级别) |
中 |
| 加密文件 |
需要防作弊的数据 |
中 |
高 |
| 云存档 |
跨设备同步 |
中 |
高 |