【Unity3D补充知识点】PlayerPrefs数据存储

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)和自定义二进制文件。

  • 跨平台云同步 → 集成 FirebasePlayFab

合理使用 PlayerPrefs 可以快速实现轻量级数据存储,但务必根据需求权衡安全性和扩展性!

猜你喜欢

转载自blog.csdn.net/qq_38350004/article/details/146335927
今日推荐