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,可以为游戏提供基础的数据持久化功能,特别适合存储简单的用户设置和游戏进度数据。