1. PlayerPrefs 是什么?
是Unity提供的可以用于存储读取玩家数据的公共类
1.1. 存储相关
PlayerPrefs的数据存储类似于键值对存储 一个键对应一个值
提供了存储3种数据的方法int float string
键:string类型
值: int float string对应3种API
PlayerPrefs.SetInt("myAge", 0);
PlayerPrefs.SetFloat("myMoney", 1999f);
PlayerPrefs.SetString("myName", "122&&113");
直接调用set相关方法只会把数据存到内存里
当游戏结束时unity会自动把数据存到硬盘中
如果游戏不是正常结束的而是崩溃数据是不会存到硬盘中的
只要调用该方法就会马上存储到硬盘中
PlayerPrefs.Save();
PlayerPrefs是有局限性的它只能存3种类型的数据
如果你想要存储别的类型的数据只能降低精度或者上升精度来进行存储
bool sex = true;
PlayerPrefs.SetInt("sex", sex ? 1 : 0);
如果不同类型用同一键名进行存储会进行覆盖
PlayerPrefs.SetFloat( "myAge", 20.2f);
1.2. 读取相关
注意运行时只要你set了对应键值对
即使你没有马上存储save在本地
也能够读取出信息
// int
int age = PlayerPrefs.GetInt("myAge");
print(age);
// 前提是如果找不到myAge对应的值就会返回函数的第二个参数默认值
age = PlayerPrefs.GetInt("myAge", 20);
Debug.Log(age);
// float
float money = PlayerPrefs.GetFloat("myMoney");
print(money);
// string
string name = PlayerPrefs.GetString("myName");
print(name);
// 判断数据是否存在
if (PlayerPrefs.HasKey("myName"))
{
print("Exist");
}
1.3. 删除数据
// 删除指定键值对
PlayerPrefs.DeleteKey("myName");
// 删除所有
PlayerPrefs.DeleteAll();
2. 存储?
2.1. PlayerPrefs存储的数据存在哪里?
不同平台存储位置不一样
Windows:
PlayerPrefs 存储在 HKCU\Software[公司名称]\产品名称] 项下的注册表中
其中公司和产品名称是在 “Project settings” 中设置的名称。
查找步骤:运行 regedit
→
\to
→ HKEY_CURRENT_USER
→
\to
→ SOFTWARE
→
\to
→ Unity
→
\to
→ UnityEditor
→
\to
→ 公司名称
→
\to
→ 产品名称
Android:
/data/data/包名/shared_prefs/pkg-name.xml
IOS
/Library/Preferences/[应用ID].plist
查找公司名称和产品名称:
3. 自定义存储
存储对象,通过以下脚本可以直接实现。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tools_Save_Data
{
private static Tools_Save_Data tools_save_data = null;
public static Tools_Save_Data GetInstance()
{
if (tools_save_data == null)
{
tools_save_data=new Tools_Save_Data();
}
return tools_save_data;
}
/// <summary>
/// 存储单个对象
/// </summary>
/// <param name="instance">继承于object的对象</param>
/// <param name="key">键值</param>
/// <param name="save2disk">是否将其存储到磁盘空间上</param>
public void SaveInstance(object instance, string key, bool save2disk = false)
{
// Step1 : convert data to json type.
var jasonData = JsonUtility.ToJson(instance);
// Step2 : use PlayerPrefs save.
if (PlayerPrefs.HasKey(key))
{
Debug.LogWarning($"{key}'s value will be override!");
}
PlayerPrefs.SetString(key, jasonData);
if (save2disk) PlayerPrefs.Save();
}
/// <summary>
/// 读取单个对象到内存中
/// </summary>
/// <param name="data"></param>
/// <param name="key"></param>
/// <returns></returns>
public bool LoadInstance<T>(out T data, string key)
{
if (PlayerPrefs.HasKey(key))
{
data = JsonUtility.FromJson<T>(PlayerPrefs.GetString(key));
return true;
}
else
{
Debug.LogWarning($"{key} is not exists!");
data = default(T);
return false;
}
}
/// <summary>
/// 删除指定对象
/// </summary>
/// <param name="key"></param>
public void DeleteInstance(string key)
{
PlayerPrefs.DeleteKey(key);
}
/// <summary>
/// 删除所有记录
/// </summary>
public void DeleteAll()
{
PlayerPrefs.DeleteAll();
}
}
参考资料:
unity3d-实现本地数据的储存(PlayerPrefs&JsonUtility)
【唐老狮】Unity数据持久化之PlayerPrefs