数据存储 PlayerPrefsXML JSON

tech2024-10-31  25

数据的持久化存储

这个简单的来讲就是一个存档的功能 如果没有这个,游戏一关,电源一拔 立马傻眼 O(∩_∩)O 但也有这样的游戏,比如一些小游戏

硬盘 大 目前一般都是买 T 固态硬盘 机械硬盘 机械硬盘分转速7200转 5400转的 转速越高 写入和读取的速度越快 内存 比硬盘小 现在一般是G级别 读取速度比硬盘快 CPU缓存(一级内存,二级内存) 基本上10兆以内 读写速度最快的 存储一些最核心 每天都要用的数据 我们写的这些代码都放在内存里了,持久化存储 需要把数据放在硬盘里 因为如果不放在硬盘里程序结束运行 这块内存就会被释放掉 单机游戏 一般这么做 网络游戏 一般都放在服务器里 缺点占用自己内存空间 不太安全 比如 找到那个文件打开改改数据这些 除非做加密处理 云端服务器 可插拔的电脑

PlayerPrefs 内置的存储类

unity内置的 存储一些简单的 存储到本地 Float Int String

存储路径分系统大不相同 Windows存储在注册表里

using UnityEngine; public class PlayerPrefs : MonoBehaviour { private void Start(){ //****************存储**************** //不需要实例化 //存储到本地 PlayerPrefs.SetFloat("Score",99.9f); //注意:这里如果换一个方法 存同名的会被覆盖 PlayerPrefs.SetString("Score","100分"); //****************读取**************** float value = PlayerPrefs.GetFloat("Score"); Debug.Log(value); } }

XML

树形结构

标签对

<头标签> 这中间是他的值 </尾标签> <头标签> <----- 他到头了 可以叫根元素 他底下的都叫子元素 <字标签> 这中间是字标签的值 </字标签尾> </尾标签> <头标签 name="Cube"> <----- 这个是他的属性 这中间是他的值 </尾标签>

小例子 存储组件

<?xml version="1.0" encoding="UTF-8"?> <------头文本文件 版本号 编码格式 <GameObject name="Cube",tag="Player"> <!--这个是注释 第一个子节点--> <Transform> <position> <x>1</x> <y>2</y> <z>3</z> </position> <rotation/> <scale/> </Transform> <BoxCollider> </BoxCollider> </GameObject>

用代码去生成XML

using UnityEngine; using System.Xml;//引用命名空间 public class XmlGenerate : MonoBehaviour { //创建文档对象 XmlDocument doc = new XmlDocument(); //相当于在内存里创建了一个空白的XML文档 还没有存到本地 //创建头文本节点 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0","UTF-8",null); //现在只是创建了头文本节点,需要加入到文档里,不然文档里还是空的 //将头文本节点放置在文档中 doc.AppendChild(dec); //创建根元素节点 //一个文档里不能有多个根节点 XmlElement pos_Element = doc.CreateElement("Position"); //创建属性 给根元素添加 pos_Element.SetAttribute("name",gameObject.name); //暂时存储一下 string pos = transform.position.ToString(); //去掉括号 //原先内容里是<Position>(11.0,22.0,33.0)</Position> //这里先从后面删除 这样不改变长度 然后再删第一个 pos = pos.Remove(pos.Length - 1).Remove(0,1); //给根元素节点设置值 pos_Element.InnerText = pos; //根元素节点添加到文档中,跟上面一样 doc.AppendChild(pos_Element); //到此为止都是存在内存里的 //存到本地 当前工程下的Assets文件夹 doc.Save(Application.dataPath + "/Demo.xml"); }

用代码解析XML

using UnityEngine; using System.Xml;//引用命名空间 public class XMLParse : MonoBehaviour { private void Start(){ //创建一个文档对象 XmlDocument doc = new XmlDocument(); //加载XML到文档里 doc.Load(Application.dataPath + "/Demo.xml"); //解析XML //拿到他的第一个子节点 XMLDeclaration node = doc.FirstChild as XMLDeclaration; } }

JSON

只能有有一个根元素

键值对

大括号里必须存一对一对的 必须是个整体 有Key 有Value

有key放大括号里

没有key放中括号里

这里边使用的是LitJson.dll 第三方的库

使用需要先创建一个Plugins文件夹 然后把第三方库粘贴到里面

unity 提前编译的三个文件夹 Standard Assets Plugins Editor

{ "LevelMsg":[ { "LevelIndex":1, "LevelStars":3 }, { "LevelIndex":2, "LevelStars":2 } ] }

写完后 可以做一个语法鉴定 防止翻车 百度搜Json在线解析 或者直接输入网址 json.cn

解析

using UnityEngine; using LitJson;//引用命名空间 //为了方便理解这里用的中文,正规的key还是英文比较好 以类的方式进行封装解析 //Json 里不认float 只认double //解析时候没事 生成的话会报错 [System.Serializable]//使用JsonUtility.FromJson要先序列化 public class Hero{ public string 英雄名称; public double 生命值; public double 攻击力; public Skill[] 技能; } [System.Serializable] public class Skill{ public string 技能名称; public int[] 技能冷却; //封装到unity可以描述的时候就不用在封装了 } public class JsonParse : MonoBehaviour { private String json = "这里粘贴那一大串json vs有的版本直接在前面加一个@符号就能自动转义 如果不能转义的可以在百度搜索字符串转义工具就有了"; private void Start(){ //解析Json JsonData data = JsonMapper.ToObject(json); //非泛型/通用型解析 Debug.Log(data["技能"][0]["技能名称"]); //泛型/指定结构解析 Hero hero = JsonMapper.ToObject<Hero>(json); Debug.Log(hero.英雄名称); Debug.Log(hero.技能[0].技能名称); //也可以转成json string jsonData = JsonMapper.ToJson(hero); Debug.Log(jsonData); //unity 也提供了json解析 hero = JsonUtility.FromJson<Hero>(json); } }
最新回复(0)