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()
,影响性能。