Unity中采用JSON进行存档和读档

在利用JSON做存档和读档之前,首先要在Assets导入一个脚本!这个脚本就是LitJson.dll
在这里插入图片描述
然后在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;
	}

下面就是重点来了,开始JSON的存档和读档部分!
JSON的存档方法:

	private void SaveByJson()
	{
		//序列化过程(将Save对象转换为字节流) 
		//创建Save对象并保存当前游戏状态
		Save save = CreateSaveGO();
		//定义字符串filePath保存文件路径信息(就是在Assets中创建的一个文件夹名称为StreamFile,然后系统会给我创建一个byJson.json用于保存游戏信息)
		string filePath = Application.dataPath + "/StreamFile" + "/byJson.json";
		//利用JsonMapper将save对象转换为Json格式的字符串(这里要引入命名空间using LitJson)
		string saveJsonStr = JsonMapper.ToJson(save);
		//将这个字符串写入到文件中
		//创建一个StreamWriter,并将字符串写入到文件中
		StreamWriter sw = new StreamWriter(filePath);
		sw.Write(saveJsonStr);
		//关闭StreamWriter
		sw.Close();
		//如果保存成功,在游戏场景中显示相应的文字信息
		UIManager._instance.ShowMessages("保存成功");
	}

JSON的读档方法:

	private void LoadByJson()
	{
		//定义字符串filePath读取文件路径信息(就是在Assets中读取一个文件夹名称为StreamFile里面的一个byJson.json保存游戏信息的文档)
		string filePath = Application.dataPath + "/StreamFile" + "/byJson.json";
		//判断要读取的游戏文档信息是否存在
		if (File.Exists(filePath))
		{
			//创建一个StreamReader,用来读取流
			StreamReader sr = new StreamReader(filePath);
			//将读取到的流赋值给jsonStr
			string jsonStr = sr.ReadToEnd();
			//关闭
			sr.Close();

			//将字符串jsonStr转换为Save对象
			Save save = JsonMapper.ToObject<Save>(jsonStr);
			//调用激活怪物以及更新分数的UI方法
			SetGame(save);

			//把文字框里面的内容清空掉
			UIManager._instance.ShowMessages("");
		}
		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),如果您觉得这篇文章写的还可以的话,不妨动动您的小手指,给俺点个赞,谢谢大家!

发布了12 篇原创文章 · 获赞 12 · 访问量 782

猜你喜欢

转载自blog.csdn.net/jianjianshini/article/details/104889139