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简介,及构建一个基础的数据存储系统的主要内容,如果未能解决你的问题,请参考以下文章

Unity PlayerPrefs 的存档,到底在哪

Unity PlayerPrefs 游戏存档

Unity 游戏存档 PlayerPrefs类的用法

Unity3DUnity3D之 注册表动态存取游戏存档——PlayerPrefs类

Unity 常用的几种存档读档方式

Unity - 存读档机制简析