Unity中EditorPrefs与PlayerPrefs对比分析
EditorPrefs与PlayerPrefs是Unity引擎中用于数据持久化的两个核心类,分别用于于编辑器扩展与游戏运行时场景。以下从设计目标、存储位置、数据类型、生命周期、安全性、使用场景等方面展开对比,并结合代码示例说明用法。
一、对比表
| 维度 | EditorPrefs | PlayerPrefs |
|---|---|---|
| 设计目标 | 编辑器扩展配置存储(如窗口布局、工具参数) | 游戏运行时玩家数据存储(如偏好设置、进度) |
| 可用环境 | 仅编辑器模式(Editor Mode) | 编辑器模式+运行时(Runtime) |
| 存储位置 | 系统注册表(Windows)/plist文件(macOS) | 平台特定路径(见下文“存储位置”) |
| 数据类型 | int、float、string、bool | int、float、string(bool需用0/1模拟) |
| 数据持久化时机 | 手动调用Save()或编辑器退出时自动保存 | 游戏正常退出时自动保存,崩溃时不保存 |
| 删除风险 | DeleteAll()可能删除编辑器自身配置(如场景、工具设置) | 仅删除玩家数据,不影响编辑器 |
| 安全性 | 明文存储(无加密) | 明文存储(Base64编码,非真正加密) |
二、详细解析
1. 设计目标与适用场景
-
EditorPrefs:
专为编辑器扩展开发设计,用于存储编辑器工具的配置信息(如窗口位置、默认路径、工具参数)。这些数据仅在编辑器中使用,无需随游戏发布。
示例:保存材质编辑器的折叠状态、自定义窗口的布局参数。 -
PlayerPrefs:
用于游戏运行时存储玩家相关数据,如偏好设置(音量、画质)、游戏进度(最高分、解锁关卡)、临时配置(上次选择的角色)。这些数据需随游戏发布,供玩家下次启动时加载。
示例:保存玩家的“音量”设置为0.8、“最高分”为1000。
2. 存储位置
-
EditorPrefs:
- Windows:
HKEY_CURRENT_USER\Software\Unity Technologies\Unity Editor [版本号](注册表) - macOS:
~/Library/Preferences/com.unity3d.UnityEditor.plist(plist文件)
- Windows:
-
PlayerPrefs:
- Windows:
HKEY_CURRENT_USER\Software\[公司名]\[游戏名](注册表) - macOS:
~/Library/Preferences/[公司名].[游戏名].plist(plist文件) - Android:
/data/data/[包名]/shared_prefs/[包名].v2.playerprefs.xml(SharedPreferences) - iOS:
NSUserDefaults系统(沙盒路径)
- Windows:
3. 数据类型与操作
-
EditorPrefs:
支持int、float、string、bool四种类型,提供SetXXX(存储)、GetXXX(读取)、HasKey(判断是否存在)、DeleteKey(删除单个键)、DeleteAll(删除所有键)等方法。
示例代码:// 存储数据 EditorPrefs.SetInt("WindowWidth", 800); EditorPrefs.SetFloat("WindowHeight", 600); EditorPrefs.SetString("LastProjectPath", "D:/Projects/MyGame"); EditorPrefs.SetBool("AutoSaveEnabled", true);// 读取数据 int width = EditorPrefs.GetInt("WindowWidth", 1024); // 默认值1024 float height = EditorPrefs.GetFloat("WindowHeight", 768); string path = EditorPrefs.GetString("LastProjectPath"); bool autoSave = EditorPrefs.GetBool("AutoSaveEnabled", false);// 删除数据 EditorPrefs.DeleteKey("AutoSaveEnabled"); // EditorPrefs.DeleteAll(); // 谨慎使用,可能删除编辑器配置 -
PlayerPrefs:
仅支持int、float、string三种类型,bool需用0(false)和1(true)模拟。提供SetXXX、GetXXX(可设置默认值)、HasKey、DeleteKey、DeleteAll等方法。
示例代码:// 存储数据(bool用0/1模拟) PlayerPrefs.SetInt("PlayerLevel", 5); PlayerPrefs.SetFloat("Volume", 0.8f); PlayerPrefs.SetString("PlayerName", "Alice"); PlayerPrefs.SetInt("IsVIP", 1); // 表示true// 读取数据(bool用0/1判断) int level = PlayerPrefs.GetInt("PlayerLevel", 1); // 默认值1 float volume = PlayerPrefs.GetFloat("Volume", 1.0f); string name = PlayerPrefs.GetString("PlayerName", "Guest"); bool isVIP = PlayerPrefs.GetInt("IsVIP", 0) == 1; // 转换为bool// 删除数据 PlayerPrefs.DeleteKey("IsVIP"); // PlayerPrefs.DeleteAll(); // 删除所有玩家数据
4. 生命周期与持久化
-
EditorPrefs:
数据存储在编辑器的注册表或plist文件中,编辑器退出时自动保存,但需手动调用Save()确保实时保存(避免编辑器崩溃丢失数据)。 -
PlayerPrefs:
数据存储在游戏沙盒或系统注册表中,游戏正常退出时自动保存,但崩溃或强制关闭时不会保存(需手动调用Save()确保数据持久化)。
5. 安全性
两者均采用明文存储(PlayerPrefs仅用Base64编码,非加密),数据易被篡改。
建议:
- 对敏感数据(如玩家密码、内购状态)进行加密(如AES加密),再存储到PlayerPrefs。
- 避免在EditorPrefs中存储敏感数据(编辑器配置可能被他人修改)。
三、使用建议
| 场景 | 推荐使用 | 原因 |
|---|---|---|
| 编辑器工具配置(如窗口布局) | EditorPrefs | 仅编辑器使用,无需随游戏发布 |
| 游戏偏好设置(如音量、画质) | PlayerPrefs | 运行时使用,需随游戏保存 |
| 游戏进度(如最高分、解锁关卡) | PlayerPrefs | 运行时使用,需随游戏保存 |
| 敏感数据(如密码、内购状态) | 加密后PlayerPrefs | 明文存储不安全,需加密保护 |
四、注意事项
-
EditorPrefs的
DeleteAll():
谨慎调用EditorPrefs.DeleteAll(),该方法会删除编辑器的所有配置(如最近打开的场景、工具设置),可能导致编辑器状态丢失。 -
PlayerPrefs的崩溃问题:
游戏崩溃时,PlayerPrefs的数据不会自动保存,需手动调用PlayerPrefs.Save()确保数据持久化。 -
数据类型限制:
EditorPrefs支持bool类型,而PlayerPrefs不支持,需用0/1模拟。 -
平台差异:
不同平台的存储路径不同(如Android的SharedPreferences、iOS的NSUserDefaults),需测试多平台兼容性。
总结
EditorPrefs与PlayerPrefs是Unity中数据持久化的核心工具,分别服务于编辑器扩展与游戏运行时场景。使用时需根据场景需求选择:
- 编辑器配置用EditorPrefs,游戏数据用PlayerPrefs;
- 敏感数据需加密存储;
- 避免频繁调用
Save(),影响性能。