Unity數據持久化
一、數據持久化基礎概念
1.1 什么是數據持久化
定義:
數據持久化就是將內存中的數據模型轉換為存儲模型,以及將存儲模型轉換為內存中的數據模型的統稱。
通俗解釋:
將游戲數據存儲到硬盤,硬盤中數據讀取到游戲中,也就是傳統意義上的存盤。
核心概念:
- 內存數據模型:游戲運行時在內存中的數據
- 存儲模型:保存在硬盤上的數據格式
- 轉換過程:序列化和反序列化
1.2 數據持久化的作用
1. 游戲進度保存
- 保存玩家游戲進度
- 記錄關卡完成狀態
- 存儲角色屬性數據
2. 用戶設置保存
- 保存游戲設置選項
- 記錄用戶偏好設置
- 存儲界面配置信息
3. 數據統計分析
- 記錄游戲統計數據
- 保存用戶行為數據
- 用于游戲優化分析
1.3 Unity中的數據持久化方式
1. PlayerPrefs
- 適合存儲簡單數據
- 鍵值對存儲方式
- 自動加密存儲
2. JSON序列化
- 適合復雜數據結構
- 可讀性強的文本格式
- 跨平臺兼容性好
3. XML序列化
- 結構化數據存儲
- 支持復雜數據類型
- 可擴展標記語言
4. 二進制序列化
- 存儲效率高
- 數據安全性好
- 文件體積小
二、PlayerPrefs
2.1 PlayerPrefs基礎概念
什么是PlayerPrefs:
PlayerPrefs是Unity自帶的類,用于保存和讀取玩家設置。它是Unity提供的最簡單的數據持久化解決方案。
特點:
- 鍵值對存儲方式
- 支持三種基本數據類型
- 自動加密存儲
- 跨平臺兼容性好
2.2 PlayerPrefs常用方法
1. 數據類型支持
PlayerPrefs只提供了三個數據類型的存取方法:
// 浮點數類型
PlayerPrefs.SetFloat(string key, float value);
PlayerPrefs.GetFloat(string key, float defaultValue);// 整數類型
PlayerPrefs.SetInt(string key, int value);
PlayerPrefs.GetInt(string key, int defaultValue);// 字符串類型
PlayerPrefs.SetString(string key, string value);
PlayerPrefs.GetString(string key, string defaultValue);
2. 數據保存機制
// 重要:直接調用Set相關方法,只會把數據存到內存中,不會保存到本地
PlayerPrefs.SetInt("score", 100);// 當游戲結束時,Unity會自動把內存中的數據保存到本地
// 但是如果游戲不是正常結束,而是被強制退出,那么內存中的數據不會被保存到本地// 手動保存:只要調用了Save方法,那么內存中的數據就會被保存到本地
PlayerPrefs.Save();
3. 數據讀取機制
// 運行時調用了Get相關方法,只要Set相關方法被調用過,就可以得到數據
int score = PlayerPrefs.GetInt("score");// 如果沒有調用過Set相關方法,那么Get相關方法會返回默認值
int defaultValue = PlayerPrefs.GetInt("notExistKey"); // 返回0// Get方法還有一個重載,如果沒有Set過可以手動設置默認值
int customDefault = PlayerPrefs.GetInt("notExistKey", 100); // 返回100
4. 數據刪除方法
// 刪除所有數據
PlayerPrefs.DeleteAll();// 刪除指定數據
PlayerPrefs.DeleteKey("intKey");
2.3 PlayerPrefs數據存儲位置
重要說明:
PlayerPrefs數據的存儲位置因平臺而異,不同操作系統有不同的存儲方式。
Windows平臺存儲位置:
#region Windows
// PlayerPrefs數據存儲在Windows注冊表中
// 存儲路徑:HKCU\Software\[公司名稱]\[產品名稱]
// 其中[公司名稱]和[產品名稱]是在Unity的"Project Settings"中設置的名稱// 查看方法:
// 運行 regedit
// HKEY_CURRENT_USER
// SOFTWARE
// Unity
// UnityEditor
// [公司名稱]
// [產品名稱]
#endregion
各平臺存儲位置對比:
平臺 | 存儲位置 | 說明 |
---|---|---|
Windows | 注冊表 | HKCU\Software\[公司名稱]\[產品名稱] |
macOS | 屬性列表文件 | ~/Library/Preferences/[公司名稱].[產品名稱].plist |
Linux | 配置文件 | ~/.config/[公司名稱]/[產品名稱] |
Android | SharedPreferences | /data/data/[包名]/shared_prefs/ |
iOS | NSUserDefaults | 應用沙盒內的plist文件 |
查看存儲數據的方法:
1. Windows平臺:
// 使用注冊表編輯器查看
// 1. 按Win+R,輸入regedit
// 2. 導航到:HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\[公司名稱]\[產品名稱]
// 3. 可以看到所有保存的鍵值對
2. 其他平臺:
// macOS: 使用Finder查看 ~/Library/Preferences/ 文件夾
// Linux: 查看 ~/.config/ 目錄下的配置文件
// Android: 使用ADB工具查看 /data/data/[包名]/shared_prefs/
// iOS: 在Xcode中查看應用沙盒內的plist文件
項目設置影響:
// Unity項目設置中的公司名稱和產品名稱決定了存儲路徑
// Edit -> Project Settings -> Player
// Company Name: 公司名稱
// Product Name: 產品名稱// 例如:
// Company Name: "MyGameStudio"
// Product Name: "MyGame"
// Windows存儲路徑:HKCU\Software\MyGameStudio\MyGame
2.4 PlayerPrefs數據唯一性
核心概念:
PlayerPrefs中不同數據的唯一性是由key決定的,不同的key決定了不同的數據。
重要警告:
同一項目中如果不同數據key相同會造成數據丟失。
解決方案:
要保證數據不丟失就要建立一個保證key唯一的規則。
通過合理使用PlayerPrefs,可以為游戲提供基礎的數據持久化功能,特別適合存儲簡單的用戶設置和游戲進度數據。