在Unity中首先创建一个Save脚本,用于保存游戏中相关的信息,在这里我存储的是游戏中怪物的位置以及类型、游戏射击总数量、游戏得分等数据,Save脚本的代码如下(这个脚本是不能挂在在场景中的游戏物体上,因为这个类没有继承自MonoBehaviour行为类):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//串行化,串行化是指存储和获取磁盘文件、内存或其他地方中的对象。
[System.Serializable]
public class Save {
public List<int> livingTargetPosition = new List<int>();
public List<int> livingMonsterTypes = new List<int>();
public int shootNum = 0;
public int score = 0;
}
然后再创建一个脚本GameManager,并放置以下的方法:
//创建Save对象并存储当前游戏状态信息
private Save CreateSaveGO()
{
//新建Save对象
Save save = new Save();
//遍历所有的Target
//如果其中有激活状态的怪物,就把该target的位置信息和激活状态的怪物的类型添加到List中
//targetGOs是存储游戏中所有怪物的一个一维数组
foreach (GameObject targetGO in targetGOs)
{
TargetManager targetManager = targetGO.GetComponent<TargetManager>();
//当这个数组中某一个元素中有怪物的时候
if(targetManager.target != null)
{
save.livingTargetPosition.Add(targetManager.targetPosition);
int type = targetManager.target.GetComponent<MonsterManager>().monsterType;
save.livingMonsterTypes.Add(type);
}
}
//把shootNum和socre保存到Save对象中
save.shootNum = UIManager._instance.shootNum;
save.score = UIManager._instance.scoreNum;
//返回Save对象
return save;
}
下面就是重点来了,开始二进制的存档和读档部分!
二进制的存档方法:
private void SaveByBin()
{
//序列化过程(将Save对象转换为字节流)
//创建Save对象并保存当前游戏状态
Save save = CreateSaveGO();
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter(); //引入命名空间using System.Runtime.Serialization.Formatters.Binary;
//创建一个文件流(就是在Assets中创建的一个文件夹名称为StreamFile,然后系统会给我创建一个byBin的文本文档用于保存信息)
FileStream fileStream = File.Create(Application.dataPath + "/StreamFile" + "/byBin.txt"); //引入命名空间using System.IO;
//用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要系列化对象
bf.Serialize(fileStream, save);
//关闭流
fileStream.Close();
//检测这个二进制文件是否存在,也就是是否保存成功
if (File.Exists(Application.dataPath + "/StreamFile" + "/byBin.txt"))
{
//这是在游戏场景中给出文字提示
UIManager._instance.ShowMessages("保存成功");
}
}
二进制的读档方法:
private void LoadByBin()
{
//如果该二进制文件存在的话
if(File.Exists(Application.dataPath + "/StreamFile" + "/byBin.txt"))
{
//反系列化的过程
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamFile" + "/byBin.txt", FileMode.Open);
//调用格式化程序的反序列化方法,将文件流转换为一个Save对象
Save save = (Save)bf.Deserialize(fileStream);
//关闭文件流
fileStream.Close();
//调用激活怪物以及更新分数的UI方法
SetGame(save);
}
else
{
UIManager._instance.ShowMessages("存档文件不存在");
}
}
根据读出的信息,进行激活怪物,以及更新场景分数UI的SetGame方法:
private void SetGame(Save save)
{
//先将所有的target里面的怪物清空,并重置所有的计时
foreach (GameObject targetGo in targetGOs)
{
targetGo.GetComponent<TargetManager>().UpdateMonsters();
}
//通过反系列化得到的Save对象中存储的信息,激活指定的怪物
for (int i = 0; i < save.livingTargetPosition.Count; i++)
{
int position = save.livingTargetPosition[i];
int type = save.livingMonsterTypes[i];
targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type);
}
//更新UI提示
UIManager._instance.shootNum = save.shootNum;
UIManager._instance.scoreNum = save.score;
//调整为未暂停状态
UnPause();
}
好了,如果还有不懂得地方可以去这个网址观看完整版的数据存档和读档!(http://www.sikiedu.com/my/course/129),如果您觉得这篇文章写的还可以的话,不妨动动您的小手指,给俺点个赞,谢谢大家!
来源:CSDN
作者:三和尚
链接:https://blog.csdn.net/jianjianshini/article/details/104886796