Unity-数据持久化-PlayerPrefs

news2024/12/23 11:31:39

一、数据持久化概念

        数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

        简单来说:就是将游戏数据存储到硬盘,将硬盘中数据读取到游戏中,也就是传统意义上的存盘。

        是Unity提供的可以用于存储读取玩家数据的公共类。

二、PlayerPrefs

(一)PlayerPrefs的基本方法

1.存储相关

PlayerPrefs的数据存储 类似于键值对存储 一个键对应一个值

提供了存储3中数据的方法 int  float  string

键:string类型

值:int  float  string  对应3种API

直接

PlayerPrefs.SetInt("myAge", 18);//存入内存
PlayerPrefs.SetFloat("myHeight", 229.5f);
PlayerPrefs.SetString("myName", "姚明");

直接调用Set相关方法 只会把数据存到内存中

当游戏结束时 Unity会自动把数据存到硬盘中

如果游戏报错崩溃,数据不会存到硬盘中

PlayerPrefs.Save();

调用该方法,会马上存储到硬盘中

 局限性:只能存3种类型数据

若想存储其他,只能降低会提高精度来存储

布尔类型

bool sex = true;

PlayerPrefs.SetInt("sex" , sex ?  1  :  0);

如果类型用同一键名存储,会覆盖

PlayerPrefs.SetFloat("myAge",20.2f);

2.读取相关

运行时,只要Set对应键值对,即使没有马上Save到本地,也可以读取信息

int age = PlayerPrefs.GetInt("myAge");//如果找不到 返回默认值0

age = PlayerPrefs.GetInt("myAge"  , 100 );

如果找不到myAge对应的值,就会返回函数的第二个参数 默认值

float height = PlayerPrefs.GetFloat("myHeight" , 1000f);

float name= PlayerPrefs.GetString("myname" , "姚明");

判断数据是否存在

PlayerPrefs.HasKey("myName");

3.删除数据

删除指定键值对

PlayerPrefs.DeleteKey();

 删除所有存储的信息

PlayerPrefs.DeleteAll();

4.练习1

 现在有玩家信息类,有名字,年龄,攻击力,防御力等成员。另有装备信息类,装备类中有id,数量两个成员。
现在为其封装两个方法,一个用来存储数据,一个用来读取数据
注意,装备是个list,所以存储时候需要遍历

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Item
{
    public int id;
    public int num;
}

public class Player
{
    public string name;
    public int age;
    public int atk;
    public int def;
    //拥有的装备信息
    public List<Item> itemList;

    //这个变量 是一个 存储和读取的一个唯一key标识
    private string keyName;

    /// <summary>
    /// 存储数据
    /// </summary>
    public void Save()
    {
        PlayerPrefs.SetString(keyName +"_name", name);
        PlayerPrefs.SetInt(keyName + "_age", age);
        PlayerPrefs.SetInt(keyName + "_atk", atk);
        PlayerPrefs.SetInt(keyName + "_def", def);
        //存储有多少个装备
        PlayerPrefs.SetInt(keyName + "_ItemNum", itemList.Count);
        for (int i = 0; i < itemList.Count; i++)
        {
            //存储每一个装备的信息
            PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);
            PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);
        }

        PlayerPrefs.Save();
    }
    /// <summary>
    /// 读取数据
    /// </summary>
    public void Load(string keyName)
    {
        //记录你传入的标识
        this.keyName = keyName;

        name = PlayerPrefs.GetString(keyName + "_name", "未命名");
        age = PlayerPrefs.GetInt(keyName + "_age", 18);
        atk = PlayerPrefs.GetInt(keyName + "_atk", 10);
        def = PlayerPrefs.GetInt(keyName + "_def", 5);

        //得到有多少个装备
        int num = PlayerPrefs.GetInt(keyName + "_ItemNum", 0);
        //初始化容器
        itemList = new List<Item>();
        Item item;
        for (int i = 0; i < num; i++)
        {
            item = new Item();
            item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);
            item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);
            itemList.Add(item);
        }
    }
}

public class Lesson1_Exercises : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

        //现在有玩家信息类,有名字,年龄,攻击力,防御力等成员
        //现在为其封装两个方法,一个用来存储数据,一个用来读取数据

        //Player p = new Player();
        //p.Load();
        //print(p.name);
        //print(p.age);
        //print(p.atk);
        //print(p.def);

        //p.name = "唐老狮";
        //p.age = 22;
        //p.atk = 40;
        //p.def = 10;
        改了过后存储
        //p.Save();

 

        Player p = new Player();
        p.Load("Player1");
        p.Save();

        Player p2 = new Player();
        p2.Load("Player2");
        p.Save();
        //装备信息
        //print(p.itemList.Count);
        //for (int i = 0; i < p.itemList.Count; i++)
        //{
        //    print("道具ID:" + p.itemList[i].id);
        //    print("道具数量:" + p.itemList[i].num);
        //}

        为玩家添加一个装备
        //Item item = new Item();
        //item.id = 1;
        //item.num = 1;
        //p.itemList.Add(item);
        //item = new Item();
        //item.id = 2;
        //item.num = 2;
        //p.itemList.Add(item);

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 (二)PlayerPrefs在不同平台的存储位置

1.不同平台存储位置不同

Window

//PlayerPrefs存储在
// HKCU\Software\[公司名称]\产品名称]项下的注册表中
//其中公司和产品名称是在“Project settings”中设置的名称。
//运行regedit
//HKEY_CURRENT_USER/ /SOFTWARE
//Unity
//UnityEditor//公司名称//产品名称
 

Android

/data/data/包名/shared_prefs/pkg-name.xml

IOS

/Library/Preferences/[应用ID].plist

2.PlayerPrefs数据唯一性

//PlayerPrefs中不同数据的唯一性

//是由key决定的,不同的key决定了不同的数据

//同一项目中 如果不同数据key相同 会造成数据丢失

//要保证数据不丢失就要建立一个保证key唯一的规则

3.练习2

要在游戏中做一个排行榜功能,排行榜主要记录玩家名(可重复),玩家得分,玩家通关时间,请用PlayerPrefs存储读取排行榜相关信息
注意:这个名字可以重复就代表了不能单独的将名字当做key

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 排行榜具体信息
/// </summary>
public class RankListInfo
{
    public List<RankInfo> rankList;

    public RankListInfo()
    {
        Load();
    }

    /// <summary>
    /// 新加排行榜信息
    /// </summary>
    public void Add(string name , int score, int time)
    {
        rankList.Add(new RankInfo(name, score, time));
    }

    public void Save()
    {
        //存储有多少条数据
        PlayerPrefs.SetInt("rankListNum", rankList.Count);
        for (int i = 0; i < rankList.Count; i++)
        {
            RankInfo info = rankList[i];
            PlayerPrefs.SetString("rankInfo" + i, info.playerName);
            PlayerPrefs.SetInt("rankScore" + i, info.playerScore);
            PlayerPrefs.SetInt("rankTime" + i, info.playerTime);
        }
    }

    private void Load()
    {
        int num = PlayerPrefs.GetInt("rankListNum", 0);
        rankList = new List<RankInfo>();
        for (int i = 0; i < num; i++)
        {
            RankInfo info = new RankInfo(PlayerPrefs.GetString("rankInfo" + i),
                                          PlayerPrefs.GetInt("rankScore" + i),
                                          PlayerPrefs.GetInt("rankTime" + i));
            rankList.Add(info);
        }
    }
}

/// <summary>
/// 排行榜单条信息
/// </summary>
public class RankInfo
{
    public string playerName;
    public int playerScore;
    public int playerTime;

    public RankInfo(string name, int score, int time)
    {
        playerName = name;
        playerScore = score;
        playerTime = time;
    }
}

public class Lesson2_Exercises : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region 练习题一 
        //将知识点一中的练习题,改为可以支持存储多个玩家信息
        #endregion

        #region 练习题二
        //要在游戏中做一个排行榜功能
        //排行榜主要记录玩家名(可重复),玩家得分,玩家通关时间
        //请用PlayerPrefs存储读取排行榜相关信息

        RankListInfo rankList = new RankListInfo();
        print(rankList.rankList.Count);
        for (int i = 0; i < rankList.rankList.Count; i++)
        {
            print("姓名" + rankList.rankList[i].playerName);
            print("分数" + rankList.rankList[i].playerScore);
            print("时间" + rankList.rankList[i].playerTime);
        }

        rankList.Add("唐老狮", 100, 99);
        rankList.Save();
        #endregion
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 (三)利用反射结合PlayerPrefs制作通用存储工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考A计划-系统集成项目管理工程师-项目合同管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

软件测试报告的作用在哪?

软件测试报告是测试工作的重要成果之一&#xff0c;它是测试人员向项目团队和相关利益相关者传递测试结果和评估软件质量的文档。软件测试报告具有以下几个重要作用&#xff1a; 1、向项目团队和管理层提供测试结果软件测试报告会详细汇报测试的执行情况、测试用例覆盖的范围、…

【Linux】学习systemctl这一篇就够了--systemctl 命令完全指南

Systemctl是一个systemd工具&#xff0c;主要负责控制systemd系统和服务管理器。 Systemd是一个系统管理守护进程、工具和库的集合&#xff0c;用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。 在Linux生态系统中&#xff0c;Systemd被部署到了大多数…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2. 插入3. 删除&#xff08;重点&#xff09;4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉树搜索的应用五.源码 前言&#xff1a; 本章我们将认识一种新的二叉树——搜索二叉树。这棵树…

【2023】Redis实现消息队列的方式汇总以及代码实现

Redis实现消息队列的方式汇总以及代码实现 前言开始前准备1、添加依赖2、添加配置的Bean 具体实现一、从最简单的开始&#xff1a;List 队列代码实现 二、发布订阅模式&#xff1a;Pub/Sub1、使用RedisMessageListenerContainer实现订阅2、还可以使用redisTemplate实现订阅 三、…

win10 64位 vs2017 qt5.12.6 pcl1.9.1 vtk8.1.1配置安装步骤

由于我电脑中有 QT5.12.6 VS2017&#xff0c;就不介绍怎么安装了&#xff0c;只介绍cmake&#xff0c;pcl及vtk的配置步骤 为了便于后续QT的调用&#xff0c;以下所有安装路径中均不能出现中文及空格等 PCL自带VTK是不完整的&#xff0c;所以需要下载VTK源码进行重新编译使其…

激光切割机在镂空技术中的运用场景具体包括哪些部分

本文将为您呈现一些激光镂空工艺的实际应用情况。激光切割机应用在镂空工艺上的一些地方。 首先&#xff0c;纸艺激光镂空的应用&#xff1a; 纸是中国古代四大发明之一&#xff0c;激光则是20世纪以来人类的一项重大发明。当传统文化与现代科技相互碰撞时&#xff0c;使得纸雕…

分享低成本非隔离PWM控制AC-DC开关芯片 YB5011

简介&#xff1a; YB5011系列是一款高性能低成本PWM控制功率开关&#xff0c;适用于离线式小功率降 压型应用场合&#xff0c;外围电路简单、器件个数少。同时产品内置高耐压MOSFET可提高 系统浪涌耐受能力,集成有完备的带自恢复功能的保护功能&#xff1a;VDD欠压保护、逐周期…

使用傲梅 VMware 备份软件保障数据保护

VMware数据保护一直是热门话题&#xff0c;因为VMware是虚拟化的驱动力。96% 的用户至少经历过数据丢失的主要原因之一&#xff1a;人为错误、硬盘驱动器故障、断电、火灾和自然灾害。 有效的 VMware 备份解决方案可以保护您的虚拟环境&#xff0c;并能够在需要时快速保护和恢…

Kafka-Broker工作流程

kafka集群在启动时&#xff0c;会将每个broker节点注册到zookeeper中&#xff0c;每个broker节点都有一个controller&#xff0c;哪个controller先在zookeeper中注册&#xff0c;哪个controller就负责监听brokers节点变化&#xff0c;当有分区的leader挂掉时&#xff0c;contro…

在商业广告领域中,LDE透明屏有哪些应用表现?

LDE透明屏是一种新型的显示技术&#xff0c;它能够在显示内容的同时保持屏幕的透明度&#xff0c;使得用户可以透过屏幕看到背后的物体。LDE透明屏的出现&#xff0c;为我们的生活带来了许多新的可能性。 首先&#xff0c;LDE透明屏可以应用于商业广告领域。 传统的广告牌需要…

浅谈实际工程中智能照明系统的节能设计

安科瑞 华楠 摘要&#xff1a;本文介绍了智能照明系统在实际工程中的应用&#xff0c;简单介绍了智能照明控制设计系统&#xff0c;阐述当前智能照明对建筑节能的重要意义&#xff0c;合理地分析了智能照明系统的发展前景。 关键词&#xff1a;智能照明系统控制&#xff0c;…

​17款画流程图的工具全面分析,功能一览!

流程图又称框图&#xff0c;是以特定的图形符号加上说明&#xff0c;表示算法的图。流程图相对于纯文字的表达而言在视觉上更清晰&#xff0c;能帮助我们进行更加有效的沟通和分析。流程图制作软件是一种提供创建图表功能的应用程序&#xff0c;解决了手动绘制流程图比较耗费时…

Roboflow制作yolov8数据集

进入官网网页 Sign in to Roboflow 先注册&#xff0c;因为是外网&#xff0c;注册前可以选择》》fanqiangruanjian 链接&#xff1a;https://pan.baidu.com/s/1YhLxSynvtcY1_FAbhc9q0g 提取码&#xff1a;f3es Roboflow标注平台使用----小白都能看懂_李大帅哥哈哈的博客-…

spring.config.location 手动指定配置文件文件

–spring.config.locationD:\javaproject\bangsun\ds-admin\ds-oper-mgr\src\main\resources\application.yml

海康视频插件VideoWebPlugin在vue中的实现

一,将js文件放在public文件下 二,在index中全局引入 三.在视频页面写方法,创建实例,初始化,我写的是1*4屏的 <template><!--视频窗口展示--><div idplayWnd classNameplayWnd refplayWnd styleleft: 0; bottom: 0;height: 902px;width: 60vw></div>&…

五分钟理解NIO与BIO

java NIO与BIO的区别&#xff1f; BIO -- Blocking IO 即阻塞式 IO。NIO -- Non-Blocking IO, 即非阻塞式 IO 或异步 IO。 BIO 基于字节流和字符流进行操作&#xff0c;数据的读取写入必须阻塞在一个线程内等待其完成。 NIO 主要有三大核心部分&#xff1a; Channel (通道)…

行业追踪,2023-08-02

自动复盘 2023-08-02 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

在线帮助中心 HelpLook 的致命弱点!!!

您可以使用Helplook搭建一个高效的企业知识库。利用这个知识库&#xff0c;您的团队成员将能够更好地管理、共享和获取内部知识&#xff0c;提高工作效率和协作能力。但是也得看清楚其中的有些功能需求是否满足&#xff01;&#xff01;&#xff01; HelpLook的功能欠缺还有很多…

【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…