Unity游戏存档与读档

news/2024/9/23 9:24:37/

目前unity常见存档和读档有几种方式,也就是常见的存储数据的方式(注意存档和读档都是针对单机游戏而言的,角色信息,道具信息,关卡情况等)

Unity存档的方式大概分为这两大类

图片来源自siki学院

图片来源自siki学院

第一种:Player Prefs,这是一种键值对的形式,也就是说需要一个键和一个值,键就是用来存放值的,它是储存在注册表中的,由于注册表有限制,并且不安全数据容易被修改,因此常用改方法储存用户设置如音量大小,按键设置等。

使用方法也比较简单,因为是Unity自带的API所以可以直接在脚本中使用,在使用时也比较简单,该类提供了三种方法写入注册表,

分别是PlayerPrefs.SetInt(), PlayerPrefs.SetFloat(),PlayerPrefs.SetString();

void Start(){//这三个是写入注册表PlayerPrefs.SetInt("IsOn", 2);//"IsOn"是键,1是值,它整个是放在注册表中的PlayerPrefs.SetFloat("Voice", 0.5f);PlayerPrefs.SetString("Name", "张三");PlayerPrefs.Save(); //直接调用Set相关方法 只会把数据存到内存里//当游戏结束时,unity会自动把数据存到硬盘中//如果游戏在运行过程中崩溃,数据不会存储到硬盘中//只要调用了该方法,数据就会立即保存。//这三个是获取//PlayerPrefs.GetInt("IsOn",0);这样的意思是获取键IsOn对应的值,如果IsOn键没有就返回0Debug.Log(PlayerPrefs.GetInt("IsOn"));Debug.Log(PlayerPrefs.GetFloat("Voice"));Debug.Log(PlayerPrefs.GetString("Name"));//判断数据是否存在:if (PlayerPrefs.HasKey("IsOn")){Debug.Log("数据存在");}
//删除指定键值对:PlayerPrefs.DeleteKey("year");
//删除所有存储信息:PlayerPrefs.DeleteAll();}

第二种:Binary(二进制):在存储较为复杂的数据,例如关卡信息,得分情况,剩余的子弹数量等公众信息时,可以将需要保存的信息都放在一个Save类中,这样就不用像写文档的形式分开存储(久而久之有可能会忘记数据对应的具体是什么),也比直接放在注册表中的功能要强大(毕竟注册表值存储三种数据类型),因此我们都会用存储类的对象的形式来储存数据(XML,Json同理)

既然要以对象的方式来存储数据,那么首先就需要创建一个新类专门用作储存数据,随后使用BinaryFormatter类将该类序列化后存入硬盘中

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[Serializable]//注意命名空间
public class Save //这是Save类
{//需要存储的具体信息根据自己的要求编写,这里只是举例internal int Score;//得分internal int PlayerLevel;//等级internal string PlayerSikll;//技能internal int PlayerHp;//血量internal int PlayerAp;//蓝量
}
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;//引入二进制转换器的命名空间
using UnityEngine;
using System.IO;public class BinarySave : MonoBehaviour
{void SaveFun()//保存函数,也就是将Save对象转换为字节流的过程{Save BinarySaveObject = new Save();//声明Save对象,记录当前的游戏状态BinarySaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类BinarySaveObject.PlayerHp = 5000;BinarySaveObject.PlayerLevel = 9;BinarySaveObject.PlayerSikll = "万雷诀";BinaryFormatter binaryFormatter = new BinaryFormatter();//这相当于一个二进制转换器FileStream fs = File.Create(Application.dataPath + "/StreamingFile" + "/BinaryTxt");//创建就一个文件流binaryFormatter.Serialize(fs, BinarySaveObject);//用二进制转换器的序列化方法把Save对象序列化,参数:创建的文件流和需要序列化的对象fs.Close();//关闭流}void LoadFun()//读档函数{if(File.Exists(Application.dataPath + "/StreamingFile" + "/BinaryTxt"))//这里最好还是判断文件是否存在{//二进制转换器BinaryFormatter bf = new BinaryFormatter();//打开一个文件流FileStream fs = File.Open(Application.dataPath + "/StreamingFile" + "/BinaryTxt", FileMode.Open);//用反序列化将文件流转换为对象Save save = (Save)bf.Deserialize(fs);fs.Close();Debug.Log(save.PlayerAp);//这里同样可以写函数返回值类型为Save类Debug.Log(save.PlayerHp);Debug.Log(save.PlayerLevel);Debug.Log(save.PlayerSikll);}}private void Start(){SaveFun();LoadFun();}
}

第三种:XML

学习XML之前先了解XML的大概格式,用一张例图应该就能明白

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;//引入头文件
using UnityEngine;public class XmlSave : MonoBehaviour
{void Save()//存档函数{Save XmlSaveObject = new Save();XmlSaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类XmlSaveObject.PlayerHp = 5000;XmlSaveObject.PlayerLevel = 9;XmlSaveObject.PlayerSikll = "万雷诀";XmlSaveObject.Score = 45;string path = Application.dataPath + "/StreamingFile" + "/ByXml.json";//这是保存的路径//创建Xml文档,首先要有xml的文档才能操作XmlDocument xmlDoc = new XmlDocument();//创建根节点,也就是最外层的节点,这里就以Save对象为例XmlElement root = xmlDoc.CreateElement("Save");//用xml文档创建//设置根节点的值,对象名字为XmlSaveObjectroot.SetAttribute("name", "XmlSaveObject");//这里同样可以写成方法//1.创建子节点,2.并添加其内容,也就是对象中的各个字段并赋值,3.再将其添加到父节点中XmlElement PlayerAp = xmlDoc.CreateElement("PlayerAp");//这是创建子节点PlayerAp.InnerText = XmlSaveObject.PlayerAp.ToString();//这是为子节点添加内容root.AppendChild(PlayerAp);//这是将子节点添加进父节点中XmlElement PlayerHp = xmlDoc.CreateElement("PlayerHp");PlayerHp.InnerText = XmlSaveObject.PlayerHp.ToString();root.AppendChild(PlayerHp);XmlElement PlayerLevel = xmlDoc.CreateElement("PlayerLevel");PlayerLevel.InnerText = XmlSaveObject.PlayerLevel.ToString();root.AppendChild(PlayerLevel);XmlElement PlayerSikll = xmlDoc.CreateElement("PlayerSikll");PlayerSikll.InnerText = XmlSaveObject.PlayerSikll.ToString();root.AppendChild(PlayerSikll);XmlElement Score = xmlDoc.CreateElement("Score");Score.InnerText = XmlSaveObject.Score.ToString();root.AppendChild(Score);xmlDoc.AppendChild(root);//这是设置root为根xmlDoc.Save(path);//将xml文档保存在指定路径}void Load()//加载函数{string path = Application.dataPath + "/StreamingFile" + "/ByXml.json";if (File.Exists(path))//判断文件是否存在{Save XmlSaveObject = new Save();//创建对象//加载XML文档XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(path);//将硬盘中的xml文档加载到刚创建的xmlDoc中//通过节点名称来获取元素,结果为XmlNodeList类型XmlNodeList SaveObejct = xmlDoc.GetElementsByTagName("Save");//遍历所有的Save(这里因为就一个就遍历一次),并获得Save的子节点和子节点的InnerTextif (SaveObejct.Count != 0)//判断是否为空{foreach(XmlNode tempsave in SaveObejct)//这里因为是获得了Save节点,想要里面的子节点就需要像下面这样{XmlNode PlayerAp = tempsave.ChildNodes[0];//第一个子节点就是PlayerApXmlSaveObject.PlayerAp = XmlConvert.ToInt32(PlayerAp.InnerText);//将第一个子节点的内容赋值给XmlSaveObject对象XmlNode PlayerHp = tempsave.ChildNodes[1];XmlSaveObject.PlayerHp = XmlConvert.ToInt32(PlayerHp.InnerText);XmlNode PlayerLevel = tempsave.ChildNodes[2];XmlSaveObject.PlayerLevel = XmlConvert.ToInt32(PlayerLevel.InnerText);XmlNode PlayerSikll = tempsave.ChildNodes[3];XmlSaveObject.PlayerSikll = PlayerSikll.InnerText;XmlNode Score = tempsave.ChildNodes[4];XmlSaveObject.Score = XmlConvert.ToInt32(Score.InnerText);}}Debug.Log(XmlSaveObject.PlayerAp);Debug.Log(XmlSaveObject.PlayerHp);Debug.Log(XmlSaveObject.PlayerLevel);Debug.Log(XmlSaveObject.PlayerSikll);Debug.Log(XmlSaveObject.Score);}}private void Start(){Save();Load();}
}

第四种:Json:Json的具体讲解看另一篇,该例子使用的是LitJson

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;public class JsonSave : MonoBehaviour
{void Save()//保存函数{Save JsonSaveObject = new Save();//声明Save对象,记录当前的游戏状态JsonSaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类JsonSaveObject.PlayerHp = 5000;JsonSaveObject.PlayerLevel = 9;JsonSaveObject.PlayerSikll = "万雷诀";JsonSaveObject.Score = 45;//这里一定要注意需要字段为public权限,不然会导致转换不成功!!!string ObjectStr = JsonMapper.ToJson(JsonSaveObject);//将Save对象序列化为Json类型的字符串string path = Application.dataPath + "/StreamingFile" + "/ByJson.json";//这是保存的路径//对象被转换成了字符串,这个时候还是需要写进文件中,因此StreamWriter writer = new StreamWriter(path);//创建文件流writer.Write(ObjectStr);//写入writer.Close();//关闭文件流       }void Load()//加载函数{//最好做下判断文档是否存在,这里省略了string path = Application.dataPath + "/StreamingFile" + "/ByJson.json";//这是想打开的文件路径StreamReader reader = new StreamReader(path);//创建读取的文件流string ObjectStr = reader.ReadToEnd();//将文本文件中的内容全部读取到字符串中,(json格式其实就算字符串类型)reader.Close();//关闭流Save JsonSaveObject = JsonMapper.ToObject<Save>(ObjectStr);//将json格式转化成对象Debug.Log(JsonSaveObject.PlayerAp);Debug.Log(JsonSaveObject.PlayerHp);Debug.Log(JsonSaveObject.PlayerLevel);Debug.Log(JsonSaveObject.PlayerSikll);Debug.Log(JsonSaveObject.Score);}private void Start(){Save();Load();}
}


http://www.ppmy.cn/news/458768.html

相关文章

放置类游戏用过的资源存档

放置类游戏用过的资源存档

安卓dialog相关最全&#xff01;&#xff01;&#xff01; https://blog.csdn.net/sakurakider/article/details/80735400 mediaPlayer 安卓音乐播放器 https://blog.csdn.net/qq_33642117/article/details/51841510 1。游戏对话界面 http://www.cnblogs.com/carlos-vic/p/Ca…
阅读更多...
Unity游戏存档的四种方式

Unity游戏存档的四种方式

【转载】http://blog.csdn.net/a237653639/article/details/50076755 游戏存档 在Unity中游戏存档有如下四种方式&#xff1a; PlayerPrefsc#序列化XML序列化Json 游戏存档是老大之前吩咐要做的&#xff0c;一开始我问可以用PlayerPrefs不呢&#xff0c;锐哥老大回答说不可…
阅读更多...
[Unity][存档][JSONUnity]存档数据应该存放在哪个文件夹内

[Unity][存档][JSONUnity]存档数据应该存放在哪个文件夹内

打包成EXE文件后&#xff0c;存档数据应该存放在哪个文件夹内 应该使用哪个变量 不管是使用哪个&#xff0c;最后都是需要打包成exe进行运行。 参考资料2中&#xff0c;三&#xff1a;重要路径-Windows:中 Application.streamingAssetsPath Debug.Log(" Application.…
阅读更多...
网易我的世界下的服务器目录在哪个文件夹,网易我的世界手机版存档导出在哪个文件夹 | 手游网游页游攻略大全...

网易我的世界下的服务器目录在哪个文件夹,网易我的世界手机版存档导出在哪个文件夹 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-04-11 我的世界手机版有很多存档玩家可以从网上下载来玩,让游戏更加有趣,不过很多玩家不太了解我的世界手机版存档怎么用?存档怎么安装?下面99安卓网小编就来分享我的世界手机版存档的安装使用方法,供玩家参考. 我的世界手机版存档安装 ... 标签&am…
阅读更多...
Android 游戏存档位置分析

Android 游戏存档位置分析

android 游戏存档分析&#xff0c; 这种存档游戏&#xff0c;对android 和ios 系统能通用; android obb 跟据官网介绍&#xff1a;obb没有固定格式&#xff0c;官网给出里zip压缩格式的一个例子&#xff0c;但是大部分游戏都要对obb 游戏的数据进行处理&#xff0c; 所以…
阅读更多...
游戏中的存档

游戏中的存档

今天想和大家分享的内容是RPG游戏中游戏存档的实现&#xff0c;因为最近在做一个RPG游戏的项目&#xff0c;所以遇到这个问题就随时记录下来&#xff0c;在对知识进行总结的同时可以将这种思路或者想法分享给大家&#xff0c;这是一件快乐而幸运的事情。我讨厌写按部就班的技术…
阅读更多...
android游戏存档在哪里,网易安卓模拟器游戏存档在哪个文件夹的详细解析

android游戏存档在哪里,网易安卓模拟器游戏存档在哪个文件夹的详细解析

网易安卓模拟器游戏存档在哪个文件夹 一、 二、您也可以点击右下角的【自定义安装】按钮&#xff0c;出现一个新的窗口&#xff0c;您可以选择网易安卓模拟器的安装位置&#xff0c;下面的选择框内容根据您的需要进行选择&#xff0c;选择完成后&#xff0c;单击[安装和安装]进…
阅读更多...
Windows下查找各类游戏存档路径

Windows下查找各类游戏存档路径

我算是个比较爱打单机游戏的人&#xff0c;同时也是个半吊子的编程爱好者&#xff0c;有的时候会去干一些修改存档的事儿。不过这篇博文不讲存档修改技术&#xff0c;只讲第一步&#xff1a;去哪找存档&#xff1f; 目标&#xff1a;在windows10系统下搜索到游戏的存档路径 实…
阅读更多...
最新文章

玻璃钢生产厂家安庆景区玻璃钢雕塑批发玻璃钢花盆哪个品牌好选料讲究的玻璃钢动物雕塑万源玻璃钢雕塑工厂玻璃钢雕塑生产加工西安玻璃钢雕塑小品批发天津玻璃钢雕塑优点湖南标牌玻璃钢仿铜雕塑公司普洱玻璃钢雕塑设计如何常熟商场美陈制作浙江季节性商场美陈报价河西商场户外美陈贵州玻璃钢雕塑厂哪家好园林景观玻璃钢雕塑施工方案宁夏动物玻璃钢雕塑定制天津多彩玻璃钢雕塑图片宁夏商场开业美陈清远玻璃钢模型雕塑玻璃钢仿真动物雕塑制作各种玻璃钢雕塑厂家供应上海商场美陈招聘信息蒙城商场节庆美陈钦州玻璃钢泡沫雕塑公司辽宁商城玻璃钢造型景观雕塑制作商场手表活动柜台七夕花艺美陈嘉兴佛像玻璃钢雕塑玻璃钢雕塑质检报告原装玻璃钢雕塑厂家诚信企业推荐桂林玻璃钢座椅雕塑设计四会玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化