Unity存档系统丨PlayerPrefs简介,及构建一个基础的数据存储系统
Posted 橙子SKODE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity存档系统丨PlayerPrefs简介,及构建一个基础的数据存储系统相关的知识,希望对你有一定的参考价值。
哈喽大家好,你的橙哥突然出现~
本系列博客地址:传送门
一、什么是PlayerPrefs
1、PlayerPrefs的作用
PlayerPrefs,是Unity引擎内建的主要用来存储玩家偏好设定的一个类,
这是官方手册里写的它的主要用途。
但其实它不只可以存储玩家的偏好设定,也可以用来存储简单的数据。
2、PlayerPrefs的格式
PlayerPrefs使用的是类似字典的存储方式。
玩家进行数据存储时,需要输入一个Key参数以及一个Value参数,也就是键和值。每个键对应一个将要存储到硬盘中的值。
在读取数据时则只需要输入键参数,就可以得到这个键对应的值了。
PlayerPrefs所用的键都是字符串类型,它支持的值类型只有三种,分别是:
- 字符串
- 整型
- 以及浮点型
这也造成了它的缺点之一:
- 存储比较复杂的数据时会比较困难
- 而它的优点则是简单易用
二、PlayerPrefs在电脑中的存储方式
1、PlayerPrefs的简单示例方法
我们来实际操作一下,实现简单的存档、读档、删除档的功能。
private void Update()
if (Input.GetKeyDown(KeyCode.A))
PlayerPrefs.SetString("myKey", "myValue");
PlayerPrefs.Save(); //保存我们设置的PlayerPrefs
if (Input.GetKeyDown(KeyCode.B))
//若能找到myKey的值,则返回存在系统中的值
//若找不到,则返回我们设置的默认的值
print(PlayerPrefs.GetString("myKey", "找不到myKey,这是默认返回值"));
if (Input.GetKeyDown(KeyCode.C))
PlayerPrefs.DeleteAll(); //删除所有的PlayerPrefs
PlayerPrefs.DeleteKey("myKey");//删除"myKey"PlayerPrefs
2、PlayerPrefs在电脑中存放的位置
PlayerPrefs将数据存储在了电脑的注册表中。
打开方式:
- Win + r 输入regedit进入注册表界面
- HKEY_CURRENT_USER/Software/Unity
- 若你在编辑器中测试的,就进入UnityEditor,找到你工程的:公司/工程名 文件夹
测试中你可以按F5,刷新注册表看一下数值。
3、PlayerPrefs的应用范围
看到这我们都知道,注册表的数值是可以修改的。我们找到那个数据,直接双击就可修改。
这也造成了一刀999、锁血的现象。玩家可以轻易的修改存档。
那么它适合用在哪里呢?
很显然的它很适合用来存储那些即使丢失了也无所谓的数据。
-
首先当然是玩家的偏好设置,比如音乐音量 是否全屏等设置选项。
-
第二 则是一些简单的数据。比如玩家的得分列表。
-
第三 是在制作游戏原型时暂时的数据存储。
总之 PlayerPrefs设计的初衷就不是为了真正的玩家存档而服务的,但它有其存在的理由。
三、使用 JsonUtility 拓展 PlayerPrefs
PlayerPrefs只支持字符串 整型以及浮点型三种数据类型的存取,
那么怎么用它来存储更为复杂的数据呢?
这里的关键就在于这个字符串类型的数据,我们将引入另一个Unity引擎内建的API:JsonUtility。
通过它,我们可以将任何Unity序列化程序支持的类转成JSON对象,将JSON字符串通过PlayerPrefs.SetString(),存储起来。
下面我们来实现一个简单的使用案例。
1、存档工具类
该类提供了两个静态方法,可完成存档、读档功能。
using UnityEngine;
public static class SaveSystem
/// <summary>
/// 存档
/// </summary>
/// <param name="key"></param>
/// <param name="data">保存了数据的类、int、string等数据</param>
public static void SaveByPlayerPrefabs(string key, object data)
var json = JsonUtility.ToJson(data);
PlayerPrefs.SetString(key, json);
PlayerPrefs.Save();
if (Application.platform == RuntimePlatform.WindowsEditor)
Debug.Log("Sava Success");
/// <summary>
/// 读档
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static string LoadFromPlayerPrefs(string key)
return PlayerPrefs.GetString(key, null);
2、使用存档工具
using System;
using UnityEngine;
public class SaveTest : MonoBehaviour
[Serializable]
class MyData
public string name;
public int level;
private void Update()
//存档示例
if (Input.GetKeyDown(KeyCode.A))
MyData myData = new MyData();
myData.name = "skode";
myData.level = 1;
SaveSystem.SaveByPlayerPrefabs("MyData", myData);
//读档示例
if (Input.GetKeyDown(KeyCode.B))
var json = SaveSystem.LoadFromPlayerPrefs("MyData");
var saveData = JsonUtility.FromJson<MyData>(json);
print(saveData.name);
//删档
if (Input.GetKeyDown(KeyCode.C))
PlayerPrefs.DeleteAll(); //删除所有的PlayerPrefs
PlayerPrefs.DeleteKey("MyData"); //删除"myKey"PlayerPrefs
下章我们讲讲 JsonUtility 的用法,
包括哪些类可被转成Json,什么叫做序列化。
我们下章再见~
如果你有 技术的问题 或 项目开发
都可以加下方联系方式
和我聊一聊你的故事🧡
以上是关于Unity存档系统丨PlayerPrefs简介,及构建一个基础的数据存储系统的主要内容,如果未能解决你的问题,请参考以下文章