unity存储系统(Save)
先写一个Save脚本用来存储你要保存的游戏内容(游戏内容一般都不一样,按照自己需求选):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable] //可序列化的
public class Save
{
public List<int> livingTargetPositions = new List<int>();
public List<int> livingMonsterTypes = new List<int>();
public int shootNum = 0;
public int score = 0;
}
在其它脚本上通过点击按钮响应脚本的方式实现保存(也可以直接边玩边保存)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using LitJson;
using System.Xml;
public GameObject[] targetGOs;
//创建Save对象并存储当前游戏状态信息
private Save CreateSaveGO()
{
//新建Save对象
Save save = new Save();
//遍历所有的target
//如果其中有处于激活状态的怪物,就把该target的位置信息和激活状态的怪物的类型添加到List中
foreach(GameObject targetGO in targetGOs)
{
TargetManager targetManager = targetGO.GetComponent<TargetManager>();
if(targetManager.activeMonster != null)
{
save.livingTargetPositions.Add(targetManager.targetPosition);
int type = targetManager.activeMonster.GetComponent<MonstManager>().monsterType;
save.livingMonsterTypes.Add(type);
}
}
//把shootNum和score保存在Save对象中
save.shootNum = UIManager._instance.shootNum;
save.score = UIManager._instance.score;
//返回该Save对象
return save;
}
//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)
private void SetGame(Save save)
{
//先将所有的target里面的怪物清空,并重置里面的计数
foreach(GameObject targetGO in targetGOs)
{
targetGO.GetComponent<TargetManager>().UpdateMonsters();
}
//通过反序列化得到的Save对象中存储的信息,激活指定的怪物
for(int i = 0; i < save.livingTargetPositions.Count;i++)
{
int position = save.livingTargetPositions[i];
int type = save.livingMonsterTypes[i];
targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type);
}
//更新UI显示
UIManager._instance.shootNum = save.shootNum;
UIManager._instance.score = save.score;
//调整为未暂停状态
UnPause();
}
//二进制方法:存档和读档
private void SaveByBin()
{
//序列化的过程(将Save对象转换为字节流)
//创建Save对象并保存当前游戏状态
Save save = CreateSaveGO();
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流保存
FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
//用二进制格式化程序的序列化方法来序列化对象,参数:创建的文件流和需要序列化的对象
bf.Serialize(fileStream,save);
//关闭流
fileStream.Close();
//如果文件存在,则显示保存成功
if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt"))
{
UIManager._instance.ShowMessage("保存成功");
}
}
private void LoadByBin()
{
if(File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt"))
{
//反序列化过程
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt",FileMode.Open);
//调用格式化程序的反序列化方法,将文件流转换为一个Save对象
Save save = (Save)bf.Deserialize(fileStream);
//关闭文件流
fileStream.Close();
SetGame(save);
UIManager._instance.ShowMessage("");
}
else
{
UIManager._instance.ShowMessage("存档文件不存在");
}
}
//Xml:存档和读档
private void SaveByXml()
{
Save save = CreateSaveGO();
//创建XML文件的存储路径
string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
//创建XML文档
XmlDocument xmlDoc = new XmlDocument();
//创建根节点,即最上层节点
XmlElement root = xmlDoc.CreateElement("save");
//设置根节点中的值
root.SetAttribute("name", "saveFile1");
//创建XmlElement
XmlElement target;
XmlElement targetPosition;
XmlElement monsterType;
//遍历Save中存储的数据,将数据转换成XML格式
for(int i=0;i<save.livingTargetPositions.Count;i++)
{
target = xmlDoc.CreateElement("target");
targetPosition = xmlDoc.CreateElement("targetPosition");
//设置InnerText值
targetPosition.InnerText = save.livingTargetPositions[i].ToString();
monsterType = xmlDoc.CreateElement("monsterType");
monsterType.InnerText = save.livingMonsterTypes[i].ToString();
//设计节点间的层级关系 root -- target -- (targetPosition,monsterType)
target.AppendChild(targetPosition);
target.AppendChild(monsterType);
root.AppendChild(target);
}
//设置射击数和分数节点并设置层级关系 xmlDoc -- root -- (target -- (targetPosition,monsterType) ,shootNum,score)
XmlElement shootNum = xmlDoc.CreateElement("shootNum");
shootNum.InnerText = save.shootNum.ToString();
XmlElement score = xmlDoc.CreateElement("score");
score.InnerText = save.score.ToString();
root.AppendChild(shootNum);
root.AppendChild(score);
xmlDoc.AppendChild(root);
xmlDoc.Save(filePath);
if (File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt"))
{
UIManager._instance.ShowMessage("保存成功");
}
}
private void LoadByXml()
{
string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
if(File.Exists(filePath))
{
Save save = new Save();
//加载XML文档
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
//通过节点名称来获取元素,结果为XmlNodeList类型
XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
//遍历所有的target节点,并获得子节点和子节点的InnerText
if(targets.Count!=0)
{
foreach(XmlNode target in targets)
{
XmlNode targetPosition = target.ChildNodes[0];
int targetPositionIndex = int.Parse(targetPosition.InnerText);
//把得到的值存储到save中
save.livingTargetPositions.Add(targetPositionIndex);
XmlNode monsterType = target.ChildNodes[1];
int monsterTypeIndex = int.Parse(monsterType.InnerText);
save.livingMonsterTypes.Add(monsterTypeIndex);
}
}
//得到存储的射击数和分数
XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");
int shootNumCount = int.Parse(shootNum[0].InnerText);
save.shootNum = shootNumCount;
XmlNodeList score = xmlDoc.GetElementsByTagName("score");
int scoreCount = int.Parse(score[0].InnerText);
save.score = scoreCount;
SetGame(save);
UIManager._instance.ShowMessage("");
}
else
{
UIManager._instance.ShowMessage("存档文件不存在");
}
}
//Json:存档和读档
private void SaveByJson()
{
Save save = CreateSaveGO();
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
//利用JsonMapper将Save对象转换为Json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
//将这个字符串写入到文件中
//创建一个StreamWriter,并将字符串写入文件中
StreamWriter sw = new StreamWriter(filePath);
sw.Write(saveJsonStr);
//关闭StreamWriter
sw.Close();
UIManager._instance.ShowMessage("保存成功");
}
private void LoadByJson()
{
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
if(File.Exists(filePath))
{
//创建一个StreamReader,用来读取流
StreamReader sr = new StreamReader(filePath);
//将读取到的流赋值给josnStr
string jsonStr = sr.ReadToEnd();
//关闭
sr.Close();
//将字符串jsonStr转换为Save对象
Save save = JsonMapper.ToObject<Save>(jsonStr);
SetGame(save);
UIManager._instance.ShowMessage("");
}
else
{
UIManager._instance.ShowMessage("存档文件不存在");
}
}
unity存储系统(Save)相关推荐
- Unity Easy Save数据保存插件将数据保存到Android手机根目录
Unity Easy Save数据保存插件将数据保存到Android手机根目录 原由 导入插件 设置保存路径 测试脚本 界面 测试验证 问题 原由 开发时碰到一个需求,两个手机APP,一个保存数据,一 ...
- 关于EMC Unity 存储系统DIMM内存的几个问题
下面是客户咨询最多的几个关于EMC Unity的DIMM内存的问题,供大家参考. 1. Unity存储能否自己扩容内存 有客户觉得Unity存储的内容太小,想自己扩容内存,很朴实的想法,原来是每个控 ...
- unity片元着色器中获取屏幕坐标_Unity踩坑笔记(持续更新)
1.error CS0104: 'MinAttribute' is an ambiguous reference between 'UnityEngine.Rendering.PostProcessi ...
- 【贪玩巴斯】Unity3D初学圣经(三)—— unity中的基础概念——scene场景,component组件,assets文件夹和Material材质,Mesh Renderer与shader
[贪玩巴斯]Unity3D初学圣经 三-- unity中的基础概念--scene场景,component组件与assets文件夹和Material材质以及Mesh Renderer 和 shader ...
- VRCHAT模型上传常见问题汇总
---------------------------------------------------------------------------------------------------- ...
- 播放器设置 Player Settings
原地址:http://game.ceeger.com/Manual/class-PlayerSettings.html#Android Player Settings is where you def ...
- [Unity3d]Player Settings导出设置
[Unity3d]Player Settings导出设置 分类: Unity3D2013-12-22 14:25 413人阅读 评论(0) 收藏 举报 目录(?)[+] Player Sett ...
- Unity存档探索:PlayerPref、 Easy Save 2、Easy Save3
PlayerPref 非常粗暴,直接使用键值对的方法存储,很适合小游戏使用(flappy bird之类) 在Windows平台下,PlayerPrefs被存储在注册表的 HKEY_CURRENT_US ...
- Unity完全学习教程-从初学者到C#中的RPG游戏开发
打造3款游戏&学习Unity实用方式!从基础开始,以一个RPG游戏结束.使用Unity 2020和C# 你会学到: 通过创建酷游戏的实用方法 游戏开发的基础和核心概念 创建一个拥有大量功能的角 ...
最新文章
- 【c语言】蓝桥杯算法训练 大等于n的最小完全平方数
- IE6Bug,外层container设置了overflow:auto,但是内层嵌套元素有position:relative的时候,显示错误。...
- 笔记-中项案例题-2019年下-人力资源管理和冲突管理
- CSS 实现背景半透明
- 均质机工作原理动画_3D动画演示:有刷直流电机的工作原理
- 【java】父类与子类的引用赋值关系
- oracle之创建和管理表
- 专题:区块链与数据共享(下)
- 不记得撞得有多痛了,可是,那个电线杆,永远都在
- array in java,ArrayList to Array Conversion in Java
- bug篇——mysql版本不支持group by分组
- 2019/7/25 node.js
- BZOJ1486: [HNOI2009]最小圈
- 【生活相关】一(坚持)
- java.net.URLEncoder 、URLDecoder 编码与解码
- eclipse汉化.设置为中文 简单好操作 java初学者看过来
- 让Visio2007/2003支持UML2.2
- Qt 之 QQ系统表情(二)
- java 绘制点阵_[Java基础知识]点阵字库在JAVA中的实现
- 如果编程语言都是漂亮的小姐姐,你会喜欢哪一个?