IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity存档系统丨PlayerPrefs简介,及构建一个基础的数据存储系统 -> 正文阅读

[游戏开发]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,什么叫做序列化。


我们下章再见~

在这里插入图片描述



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

都可以加下方联系方式

和我聊一聊你的故事🧡

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 22:03:23  更:2021-11-14 22:05:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 22:38:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码