PlayerPrefs类
PlayerPrefs是Unity引擎为了方便开发者而提供的一个专门用于数据持久化的类,其提供了很多静态方法,可以存取程序中不同类型的数据,目前支持的数据类型有整型、浮点型和字符串型,暂不支持其他数据类型。
1.存储机制
PlayerPrefs内部以字典的方式存储所有数据,即每一个数据都是一组键值对(Key-Value Pair)。其中,键(Key)指代数据的名称,必须为string类型且不能重复;而值(Value)则存储了数据值本身,其类型没有限制,可以是任意object类型。
PlayerPrefs中的存档数据
数据键(Key) |
数据值(Value) |
数据类型 |
NicName |
水月花 |
string |
Level |
10 |
int |
AtkSpeed |
1.3 |
float |
HP |
576 |
int |
PlayerPrefs遵循“有则修改,无则添加”的原则,即对于将要存储的某个数据,若在其内部不存在则会以一组新的数据形式添加到其中,否则就会修改对应的数据值。
2.存储路径
PlayerPrefs本质上也是将数据存储在设备某一个目录下的文件中,然而不同的平台数据存储路径也不一样,表10-2-2列出了各个平台下PlayerPrefs的对应数据存储路径。
PlayerPrefs在不同平台对应的数据存储路径
平台 |
路径 |
MacOS |
~/Library/Preferences |
Windows |
注册表中,对应的键为HKCU\Software\[company name]\[product name] |
Linux |
~/.config/unity3d/[CompanyName]/[ProductName] |
Android |
/data/data/pkg-name/shared_prefs/pkg-name.xml |
3.常用方法
PlayerPrefs类中包含的方法都是静态方法,可以不需要创建对象而直接通过类名类访问。PlayerPrefs中的静态方法如表10-2-3所示。
PlayerPrefs中的静态方法
方法 |
含义 |
SetFloat()、GetFloat() |
存储、读取float类型的数据 |
SetInt()、GetInt() |
存储、读取int类型的数据 |
SetString()、GetString() |
存储、读取string类型的数据 |
DeleteAll() |
删除所有已存储数据 |
DeleteKey() |
删除某个Key值的数据 |
HasKey() |
判断是否存在该Key值的数据 |
Save() |
立即将缓存中的数据写入磁盘文件中 |
4.应用案例
下面通过一个简单的案例来巩固一下PlayerPrefs类的基本使用方法,在这个案例中我们会首先通过PlayerPrefs存储几个不同类型的游戏数据,然后再依次把它们都读取出来。
①打开Unity,创建一个名为PlayerPrefsDemo的新工程,如图10-2-1所示。
创建PlayerPrefs基本用法测试工程
②创建两个场景SceneA和SceneB,然后创建一个名为SaveData.cs的脚本并挂到SceneA主相机下,再创建一个名为ReadData.cs的脚本并挂到SceneB主相机下,如图10-2-2所示。
SceneA和SceneB
③打开SaveData.cs脚本,在此脚本的Start()方法中编写存储数据的代码,共存储了玩家的金币(整型)、圆周率(浮点型)以及玩家昵称(字符串型)三种不同类型的数据。代码如下:
/*测试存储游戏数据*/
public class SaveData : MonoBehaviour
{
void Start ()
{
//存储玩家金币
PlayerPrefs.SetInt("Money", 10000);
//存储圆周率
PlayerPrefs.SetFloat("PI", 3.14f);
//存储玩家昵称
PlayerPrefs.SetString("NicName", "东方不败");
}
}
④打开ReadData.cs脚本,在此脚本的Start()方法中编写读取数据的代码,共存储了玩家的金币(整型)、圆周率(浮点型)以及玩家昵称(字符串型)三种不同类型的数据。代码如下:
/*读取游戏中存储的数据*/
public class ReadData : MonoBehaviour
{
void Start ()
{
//判断是否存在键为Money的数据
if(PlayerPrefs.HasKey("Money"))
{
//取出Money的值并打印
Debug.Log(PlayerPrefs.GetInt("Money"));
}
//判断是否存在键为PI的数据
if (PlayerPrefs.HasKey("PI"))
{
//取出PI的值并打印
Debug.Log(PlayerPrefs.GetFloat("PI"));
}
//判断是否存在键为NicName的数据
if (PlayerPrefs.HasKey("NicName"))
{
//取出NicName的值并打印
Debug.Log(PlayerPrefs.GetString("NicName"));
}
}
}
⑤首先运行SceneA场景,存入三个数据,然后运行SceneB场景。可以看到,在控制台面板输出了之前存储的三个数据值,如图10-2-3所示。