本文转载自:https://blog.csdn.net/heliocentricism/article/details/109168563
PlayerPrefs类
PlayerPrefs是Unity引擎为了方便开发者而提供的一个专门用于数据持久化的类,其提供了很多静态方法,可以存取程序中不同类型的数据,目前支持的数据类型有整型、浮点型和字符串型,暂不支持其他数据类型。
1.存储机制
PlayerPrefs内部以字典的方式存储所有数据,即每一个数据都是一组键值对(Key-Value Pair)。其中,键(Key)指代数据的名称,必须为string类型且不能重复;而值(Value)则存储了数据值本身,其类型没有限制,可以是任意object类型。
PlayerPrefs中的存档数据
数据键(Key) | 数据值(Value) | 数据类型 |
---|---|---|
NicName | 水月花 | string |
Level | 10 | int |
AtkSpeed | 1.3 | float |
注意:无法存储bool类型,可以将bool类型转化为int类型,再进行存储
PlayerPrefs遵循“有则修改,无则添加”的原则,即对于将要存储的某个数据,若在其内部不存在则会以一组新的数据形式添加到其中,否则就会修改对应的数据值。
2.存储路径
PlayerPrefs本质上也是将数据存储在设备某一个目录下的文件中,然而不同的平台数据存储路径也不一样,表列出了各个平台下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中的静态方法如表所示。
PlayerPrefs中的静态方法
方法 | 含义 |
---|---|
SetFloat()、GetFloat() | 存储、读取float类型的数据 |
SetInt()、GetInt() | 存储、读取int类型的数据 |
SetString()、GetString() | 存储、读取string类型的数据 |
DeleteAll() | 删除所有已存储数据 |
DeleteKey() | 删除某个Key值的数据 |
HasKey() | 判断是否存在该Key值的数据 |
Save() | 立即将缓存中的数据写入磁盘文件中 |
4.应用案例
下面通过一个简单的案例来巩固一下PlayerPrefs类的基本使用方法,在这个案例中我们会首先通过PlayerPrefs存储几个不同类型的游戏数据,然后再依次把它们都读取出来。
①打开Unity,创建一个名为PlayerPrefsDemo的新工程,如图所示。
②创建两个场景SceneA和SceneB,然后创建一个名为SaveData.cs的脚本并挂到SceneA主相机下,再创建一个名为ReadData.cs的脚本并挂到SceneB主相机下,如图所示。
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场景。可以看到,在控制台面板输出了之前存储的三个数据值,如图所示。