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