Unity 的 PlayerPrefs 是用于在本地存储简单数据(如玩家偏好设置、游戏进度等)的轻量级工具。它支持存储 int、float、string 三种类型的数据,数据会持久化保存在设备上(不同平台的存储路径不同)。
基础用法
保存数据
- SetInt / SetFloat / SetString
存储整数、浮点数、字符串类型的数据:
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetFloat("Volume", 0.8f);
PlayerPrefs.SetString("PlayerName", "Alice");
PlayerPrefs.Save(); // 显式保存(Unity 会自动保存,但建议必要时手动调用)
读取数据
- GetInt / GetFloat / GetString / HasKey
读取数据,可设置默认值(当键不存在时返回默认值):
int highScore = PlayerPrefs.GetInt("HighScore", 0);
float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
string playerName = PlayerPrefs.GetString("PlayerName", "Guest");
bool hasKey = PlayerPrefs.HasKey("UserInfo");
删除数据
- 删除指定键
PlayerPrefs.DeleteKey("Volume");
- 清空所有数据
PlayerPrefs.DeleteAll();
适用场景
-
存储玩家偏好设置(如音量、画质、语言)。
-
记录简单进度(如最高分、解锁的关卡)。
-
保存临时配置(如上次选择的角色)。
高级技巧
存储复杂数据结构
- JSON 序列化
将对象转为 JSON 字符串存储:
// 存储
PlayerData data = new PlayerData {
level = 5, coins = 200 };
string json = JsonUtility.ToJson(data);
PlayerPrefs.SetString("PlayerData", json);
// 读取
string loadedJson = PlayerPrefs.GetString("PlayerData");
PlayerData loadedData = JsonUtility.FromJson<PlayerData>(loadedJson);
加密敏感数据
-
PlayerPrefs 数据以明文存储(如 Windows 的注册表),容易被篡改。
-
对敏感数据(如内购状态)进行简单加密:
// 加密存储
string encrypted = Base64Encode(JsonUtility.ToJson(data));
PlayerPrefs.SetString("SecureData", encrypted);
// 解密读取
string decrypted = Base64Decode(PlayerPrefs.GetString("SecureData"));
批量操作键
- 通过键名前缀批量管理数据:
// 删除所有以 "Level_" 开头的键
foreach (string key in PlayerPrefs.GetAllKeys()) {
if (key.StartsWith("Level_")) {
PlayerPrefs.DeleteKey(key);
}
}
注意事项
性能问题
- 频繁读写大数据会影响性能,适合小规模数据。
- 避免在每帧中调用 Save()。
平台差异
-
Windows: 存储在注册表 HKCU\Software[CompanyName][ProductName]。
-
macOS/Linux: 存储在 ~/.config/unity3d/[CompanyName]/[ProductName]。
-
Android/iOS: 存储在 /data/data/pkg-name/shared_prefs/pkg-name.xml。
数据安全
- 不要用 PlayerPrefs 存储敏感信息(如密码),即使加密也不安全。
- 玩家可手动修改数据(如通过第三方工具)。
数据类型限制
- 不支持 bool、Vector3 等复杂类型,需手动转换:
// 存储 Vector3
PlayerPrefs.SetFloat("PosX", position.x);
PlayerPrefs.SetFloat("PosY", position.y);
PlayerPrefs.SetFloat("PosZ", position.z);
替代方案
-
需要存储大量数据 → 使用文件系统(如 JSON、XML)或 SQLite 数据库。
-
需要高安全性 → 结合加密库(如 AES)和自定义二进制文件。
-
跨平台云同步 → 集成 Firebase 或 PlayFab。
合理使用 PlayerPrefs 可以快速实现轻量级数据存储,但务必根据需求权衡安全性和扩展性!