第一部分:PlayerPrefs基本概念
- 什么是数据持久化
数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称,通俗来说就是我们所谓的“存盘”。 - 什么是PlayerPrefs
PlayerPrefs是Unity官方提供的一种简单存储系统,主要是利用键值对进行数据存储,常用于对本地存储用户的偏好设置数据和运行基础数据等。
因其轻量级数据存储且兼容性好,常用于数据持久化或会话保存等功能。
其支持的保存数据仅三种类型,分别为:int、float和string类型 - PlayerPrefs基本的API
3.1 存储API
SetInt/SetFlota/SetString
//参数采用键值对的形式进行存储,第一个参数默认是String类型的键名,第二个参数对应存储的数据类型
PlayerPrefs.SetInt("年龄",18);
PlayerPrefs.SetFloat("成绩",20.0f);
PlayerPrefs.SetString("姓名","小明");
3.2 读取API
GetInt/GetFloat/GetString
//读取时有两种写法,第一种时以下写法,第二种时单参数写法
//当前写法中两个参数分别代表的是键名与默认值,当查找数据不存在可以使用默认数据进行读取
PlayerPrefs.GetInt("年龄",10);
PlayerPrefs.GetFloat("成绩",0.0f);
PlayerPrefs.GetString("姓名","小明");
//第二种写法【不推荐】 当前写法可能会出现查找不到数据时产生程序错误,进而影响程序进程
PlayerPrefs.GetInt("年龄");
PlayerPrefs.GetFloat("成绩");
PlayerPrefs.GetString("姓名");
3.3 其他使用API
HasKey/DeleteKey/DeleteAll/Save
//使用HasKey可以用于检查键名对应数据是否存在,书写方法如下
PlayerPrefs.HasKey("姓名");
//使用DeleteKey是用于删除对应键名的数据,通常需要明确知道对应键名,若不能清楚知道键名勿用
PlayerPrefs.DeleteKey("需要删除的数据键名");
//使用DeleteAll是用于删除所有的存储数据,相当于注销账号的操作了
PlayerPrefs.DeleteAll();
//使用Save是保存数据到硬盘中,所有的数据持久化没有保存到硬盘中都是相当于无用功。
PlayerPrefs.Save();
上面我们也有说调用Set方法是可以将数据进行存储,但是这个存储只是将数据存储到内存中,当程序结束时Unity会自动将数据保存到硬盘中,但是如果程序不是正常结束的,而是因为一些特殊情况导致崩盘行为,数据就没有办法保存到硬盘中,这个时候就会出现数据丢失问题,通常我们会优先选择使用Save函数进行数据立刻存储。
第二部分:基础使用
- 基本数据类型存储
using UnityEngine;
public class BasicPlayerPrefsExample : MonoBehaviour
{
void Start()
{
// 存储基本数据类型
PlayerPrefs.SetInt("PlayerScore", 100);
PlayerPrefs.SetFloat("PlayerHealth", 75.5f);
PlayerPrefs.SetString("PlayerName", "John Doe");
// 立即保存到磁盘(通常在重要数据变更后调用)
PlayerPrefs.Save();
// 读取数据
int score = PlayerPrefs.GetInt("PlayerScore", 0);
float health = PlayerPrefs.GetFloat("PlayerHealth", 100f);
string name = PlayerPrefs.GetString("PlayerName", "Unknown");
Debug.Log($"玩家: {
name}, 分数: {
score}, 生命值: {
health}");
}
}
- 数据检查与删除
using UnityEngine;
public class PlayerPrefsManagement : MonoBehaviour
{
void Start()
{
// 检查键是否存在
if (PlayerPrefs.HasKey("PlayerLevel"))
{
int level = PlayerPrefs.GetInt("PlayerLevel");
Debug.Log($"玩家等级: {
level}");
}
else
{
Debug.Log("玩家等级数据不存在");
}
// 删除特定键
PlayerPrefs.DeleteKey("TempData");
// 删除所有数据(谨慎使用!)
// PlayerPrefs.DeleteAll();
}
}
PlayerPrefs是有一定的局限性的,只能够存储三种类型的数据,如果想要存储别的类型甚至是自定义类型的就需要进行数据转换,通过降低精度或提高精度实现数据的存储。
例如bool类型存储就需要用Int类型进行转换
bool sex=true;
PlayerPrefs.SetInt("性别",sex?1:0);
如果存储的时候选择的是不同类型但是键名相同,数据会被覆盖成最新的数据,如:
PlayerPrefs.SetInt("年龄",18);
PlayerPrefs.SetFloat("年龄",20.0f);
输出的结果就是为20;
所以选择使用PlayerPrefs的时候也是有一定的优劣势的:
优点:
是数据持久化系列中最简单的一部分,简单快捷易懂
缺点:
重复性工作过多,自定义数据类型都需要自己去实现读取功能,而且代码的相似度极高,数据很容易被修改。
常见的PlayerPrefs使用环境有:
安全性要求不高的简单数据、原生数据等。
第三部分:中级应用
- 存储复杂数据类型
想要存储复杂数据类型就需要将原类型转换为字符串类型进行存储
using UnityEngine;
using System.Collections.Generic;
public class ComplexDataStorage : MonoBehaviour
{
[System.Serializable]
public class GameSettings
{
public float musicVolume;
public float sfxVolume;
public bool fullscreen;
public int resolutionIndex;
}
void Start()
{
// 存储复杂对象
GameSettings settings = new GameSettings()
{
musicVolume = 0.8f,
sfxVolume = 0.9f,
fullscreen = true,
resolutionIndex = 2
};
// 将对象转换为 JSON 字符串存储
string jsonData = JsonUtility.ToJson(settings);
PlayerPrefs.SetString("GameSettings", jsonData);
PlayerPrefs.Save();
// 读取并解析数据
string loadedJson = PlayerPrefs.GetString("GameSettings", "");
if (!string.IsNullOrEmpty(loadedJson))
{
GameSettings loadedSettings = JsonUtility.FromJson<GameSettings>(loadedJson);
Debug.Log($"音乐音量: {
loadedSettings.musicVolume}");
}
}
}
- 存储数组和列表
using UnityEngine;
using System.Collections.Generic;
public class ArrayStorageExample : MonoBehaviour
{
void Start()
{
// 存储整数数组
int[] scores = {
100, 85, 92, 78 };
StoreIntArray("HighScores", scores);
// 读取整数数组
int[] loadedScores = LoadIntArray("HighScores");
foreach (int score in loadedScores)
{
Debug.Log($"分数: {
score}");
}
// 存储字符串列表
List<string> completedLevels = new List<string> {
"Level1", "Level3", "Level5" };
StoreStringList("CompletedLevels", completedLevels);
// 读取字符串列表
List<string> loadedLevels = LoadStringList("CompletedLevels");
foreach (string level in loadedLevels)
{
Debug.Log($"已完成关卡: {
level}");
}
}
// 存储整数数组
private void StoreIntArray(string key, int[] array)
{
// 存储数组长度
PlayerPrefs.SetInt(key + "_Count", array.Length);
// 存储每个元素
for (int i = 0; i < array.Length; i++)
{
PlayerPrefs.SetInt(key + "_" + i, array[i]);
}
}
// 读取整数数组
private int[] LoadIntArray(string key)
{
// 获取数组长度
int count = PlayerPrefs.GetInt(key + "_Count", 0);
// 创建数组并读取元素


1万+

被折叠的 条评论
为什么被折叠?



