栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity存档系统丨(一)PlayerPrefs简介,及构建一个基础的数据存储系统

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
{
    /// 
    /// 存档
    /// 
    /// 
    /// 保存了数据的类、int、string等数据
    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");
    }

    /// 
    /// 读档
    /// 
    /// 
    /// 
    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(json);
            print(saveData.name);
        }

        //删档
        if (Input.GetKeyDown(KeyCode.C))
        {
            PlayerPrefs.DeleteAll(); //删除所有的PlayerPrefs
            PlayerPrefs.DeleteKey("MyData"); //删除"myKey"PlayerPrefs
        }
    }
}




下章我们讲讲 JsonUtility 的用法,

包括哪些类可被转成Json,什么叫做序列化。


我们下章再见~





如果你有 技术的问题 项目开发

都可以加下方联系方式

和我聊一聊你的故事李

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900263.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号