什么是数据持久化?
数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内从中的数据模型的统称
即:游戏数据存储到硬盘,硬盘中的数据读取到游戏中
游戏运行时—(变量数据)—内存<——>硬盘
PlayerPref是Unity提供的可以用于存储读取玩家数据的公共类
1、存储相关
PlayerPrefs的数据存储类似于键值对存储,一个键对应一个值,提供了存储3中数据的方法:int,float,string
键:string类型
值:int,float,string,对应3中API
PlayerPrefs.SetInt("myAge", 18);
PlayerPrefs.SetFloat("myHeight", 177.5f);
PlayerPrefs.SetString("myName", "hp”);
直接调用Set方法,只会把数据存到内存里,当游戏结束是,Unity会自动把数据存到硬盘中,如果游戏不是正常结束,而是崩溃,数据是不会存到硬盘中的
// 只要调用该方法,就会马上存储到硬盘中
PlayerPrefs.Save();
PlayerPrefs是由局限性的,它只能存3中类型的数据,如果想要存储别的类型的数据,只能降低精度,或者上升精度来进行存储
// 如果想存入bool类型的值
bool sex = true;
PlayerPrefs.SetInt("sex", sex ? 1: 0);
// 如果不同类型用同一键名进行存储,会进行覆盖
PlayerPrefs.SetFloat("myAge", 20.2f);
那么myAge的值从int类型的18变为20.2f
2、读取相关
// 注意,运行时,只要Set了对应键值对,即使现在没有马上存储Save在本地,也能够读取信息,即有限在内存中寻找,如果没有才会在本地硬盘中查找
// int
int age = PlayerPrefs.GetInt("myAge");
如果没有对应的键,即键名或者类型错误,那么会返回一个默认值,默认值可以通过重载第二个参数设置:
// int
int age = PlayerPrefs.GetInt("myAge", 100);
// float
float height = PlayerPrefs.GetFloat("myHeight", 1000f);
// string,可以不传默认参数,即使没有也会返回空字符串
string name = PlayerPrefs.GetString("myName");
// 判断数据是否存在(主要用来判断键名是否重复避免被覆盖)
if (PlayerPrefs.HasKey("myName")) {
// 相关操作
}
4、删除数据
(1)删除指定键值对
PalyerPrefs。DeleteKey("myAge");
(2)删除所有存储的信息 (通常测试时使用)
PlayerPrefs.DeleteAll()
5、PlayerPrefs数据的存储位置
(1)Windows
HKCU\Software\[公司名称]\[产品名称]项下的注册表中
其中公司和产品名称是在"Project Settings“中设置的名称:File->Build Settings->Player Settings->Player
运行 cmd->regedit:HKEY_CURRENT_UESE->SOFTWARE->UNITY->UnityEditor->公司名称->产品名称
可以对注册表中数据直接进行修改
(2)Android
/data/data/包名/shared_prefs/pkg-name.xml
(3)IOS
/LIbrary/Preferences/[应用ID].plist
6、PlayerPrefs数据的唯一性
PlayerPrefs中不同数据的唯一性,是由key决定的,不同的key决定了不同的数据,同一项目中,如果不同数据key相同,会造成数据丢失,要保证数据不丢失就要建一个保证key位移的规则
总结:
PlayerPrefs优点是:简单,快捷,易懂;
缺点是:重复工作量繁多,自定义数据类都需要自己去实现存储读取的功能,而且代码的相似度极高;数据容易被修改,主要找到文件位置,就可以轻易的进行数据修改
主要用处:单独使用它的原生功能非常适合存储一些对安全性要求不高的简单数据,进行简单的封装也可以变得方便安全
|