本课程全部学习,感谢Sandy老师提供的资源和教学!
本课程全部学习,感谢Sandy老师提供的资源和教学!
private void LoadByXML()
{
//创建一个XML的文件路径
string filePath = Application.dataPath + "/MyPro/Save" + "/ByXML.txt";
if (File.Exists(filePath))
{
//创建save对象
SaveManager save = new SaveManager();
//创建XML文档出来读取filepath路径文件
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(filePath);
//通过节点名字来获取元素,结果为xmlnodelist类型
XmlNodeList Monsters = xmldoc.GetElementsByTagName("怪物信息");
//遍历所有的Monsters里的节点,并获得子节点和子节点的InnerText
if (Monsters.Count != 0)
{
foreach(XmlNode Monster in Monsters)
{
//遍历"怪物信息"里的位置和种类,并把得到的值保存到save里
XmlNode monsterposition = Monster.ChildNodes[0];
int monsterpositionIndex = int.Parse(monsterposition.InnerText);
save.MonstersPosition.Add(monsterpositionIndex);
//这里的ChildNodes[1]指的是在Monster里第2个节点
XmlNode monstertype = Monster.ChildNodes[1];
int monstertypeIndex = int.Parse(monstertype.InnerText);
save.MonstersType.Add(monstertypeIndex);
}
}
//得到存储的射击数和分数
XmlNodeList shootNum = xmldoc.GetElementsByTagName("位置");
int shootNumIndex = int.Parse(shootNum[0].InnerText);
save.ShootNum = shootNumIndex;
XmlNodeList grade = xmldoc.GetElementsByTagName("分数");
int gradeIndex = int.Parse(grade[0].InnerText);
save.Grade = gradeIndex;
UIScript._instance.ShowMessage("成功读取文档");
StartCoroutine("IsMessage");
//通过读档信息重置游戏状态
SetGame(save);
}
else
{
UIScript._instance.ShowMessage("存档文件不存在");
StartCoroutine("IsMessage");
}
}
private void SaveByXML()
{
//创建Save对象并保存当前游戏状态
SaveManager save = CreatSave();
//创建一个XML的文件路径
string filePath = Application.dataPath + "/MyPro/Save" + "/ByXML.txt";
//创建XML文档
XmlDocument Xmldoc = new XmlDocument();
//创建根节点,最上层的节点
XmlElement root = Xmldoc.CreateElement("SaveXML");
//设置根节点中的值(键值对的值)
root.SetAttribute("name", "XML储存信息");
//继续创建根节点(怪物信息---(包含)怪物的位置,种类)
XmlElement Monsters;
XmlElement monstersposition;
XmlElement monsterstype;
//遍历save并将里面保存的数据转换成XML格式内容
for (int i = 0; i < save.MonstersPosition.Count; i++)
{
//设置"怪物信息"节点名字
Monsters = Xmldoc.CreateElement("怪物信息");
//设置InnerText值,怪物位置和种类节点名字
monstersposition = Xmldoc.CreateElement("位置");
monstersposition.InnerText = save.MonstersPosition[i].ToString();
monsterstype = Xmldoc.CreateElement("种类");
monsterstype.InnerText = save.MonstersType[i].ToString();
//设置节点间的层级关系root--Monsters--(monstersposition,monsterstype)
Monsters.AppendChild(monstersposition);
Monsters.AppendChild(monsterstype);
root.AppendChild(Monsters);
}
//设置射击数和分数节点,并且设置层级关系
XmlElement shootNum = Xmldoc.CreateElement("射击数");
shootNum.InnerText = save.ShootNum.ToString();
root.AppendChild(shootNum);
XmlElement grade = Xmldoc.CreateElement("分数");
grade.InnerText = save.Grade.ToString();
root.AppendChild(grade);
//里面子信息都设置好之后,将总root加到xmldoc文档里,并且保存
Xmldoc.AppendChild(root);
Xmldoc.Save(filePath);
if (File.Exists(filePath))
{
UIScript._instance.ShowMessage("保存成功");
StartCoroutine("IsMessage");
}
}
private void LoadByJson()
{
string filepath=Application.dataPath+ "/MyPro/Save" + "/ByJson.json";
if (File.Exists(filepath))
{
//创建一个StreamReader(跟存档反着来,这个是专门用来读取json格式文件的函数)
StreamReader sr = new StreamReader(filepath);
//将读取到的内容流赋值给string变量
string jsonstr = sr.ReadToEnd();
//关闭流
sr.Close();
//将读取到的json格式内容流字符串转换为SaveManager对象
//利用jsonMapper将读取到的json格式内容流字符串转换成save对象
SaveManager save = JsonMapper.ToObject<SaveManager>(jsonstr);
UIScript._instance.ShowMessage("成功读取文档");
StartCoroutine("IsMessage");
//通过读档信息重置游戏状态
SetGame(save);
}
else
{
UIScript._instance.ShowMessage("存档文件不存在");
StartCoroutine("IsMessage");
}
}
private void SaveByJson()
{
//创建Save对象并保存当前游戏状态
SaveManager save = CreatSave();
//创建一个文件流
string FilePath = Application.dataPath + "/MyPro/Save" + "/ByJson.json";
//利用JsonMapper将save对象转换为Json格式的字符串
string SaveJsonStr = JsonMapper.ToJson(save);
//将转换好的json字符串写到json文件流中
//创建一个StreamWriter(可以看作用来保存json格式的文件流,上面的FilePath是普通的文件流路径),并将字符串写入文件中
StreamWriter sw = new StreamWriter(FilePath);
sw.Write(SaveJsonStr);
//关闭文件流
sw.Close();
UIScript._instance.ShowMessage("保存成功");
StartCoroutine("IsMessage");
}
//二进制方法:存档和读档
private void SaveByBinary()
{
//序列化过程(将Save对象转换为字节流)
//创建Save对象并保存当前游戏状态
SaveManager save = CreatSave();
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流
FileStream fileStream = File.Create(Application.dataPath + "/MyPro/Save" + "/ByBinary.txt");
//用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
bf.Serialize(fileStream, save);
//保存完成之后关闭文件流
fileStream.Close();
//保存的时候跳出提示信息
if (File.Exists(Application.dataPath + "/MyPro/Save" + "/ByBinary.txt"))
{
UIScript._instance.ShowMessage("保存成功");
}
}
//创建save对象(单独写一个save类脚本)并储存当前游戏状态信息
private SaveManager CreatSave()
{
//新建SaveManager对象
SaveManager save = new SaveManager();
//遍历九组位置的怪物组
foreach(GameObject allmonsters in AllMonsters)
{
//新建一个遍历出来的九组MonstersScript对象
MonsterScript monsterScript = allmonsters.GetComponent<MonsterScript>();
//把九组里(每组都有四种类型的怪物)激活的怪物的位置和种类储存下来
if (monsterScript.activeMonster != null)
{
//储存九组里哪组的位置信息
save.MonstersPosition.Add(monsterScript.MonsterPos);
//储存每组当中激活状态的怪物种类
int type = monsterScript.activeMonster.GetComponent<monstercollision>().monsterType;
save.MonstersType.Add(type);
}
}
//把UI面板上的分数和子弹数保存下来(因为只有一个UI分数所以可以适用单例模式)
save.ShootNum = UIScript._instance.shootnum;
save.Grade = UIScript._instance.grade;
//返回SaveManager对象
return save;
}
gameObject.GetComponent<BoxCollider>().enabled = false;
//播放开火动画并初始化shootTimer
gameObject.GetComponent<Animation>().Play();
shootTimer = 0;
void Start()
{
StartCoroutine("DestroyMyself");
}
IEnumerator DestroyMyself()
{
//等待3秒之后销毁自身
yield return new WaitForSeconds(3);
Destroy(this.gameObject);
}
//施加一个力给子弹,让子弹移动
Bullet.GetComponent<Rigidbody>().AddForce(transform.forward * 3000);
if(Input.GetMouseButtonDown(0))
{
GameObject Bullet = GameObject.Instantiate(bullet, firePos.position, Quaternion.identity);
}
//协程
IEnumerator AliveTimer()
{
yield return new WaitForSeconds(Random.Range(1, 5));
ActivateMonster();
}
public GameObject[ ] monster;
public GameObject activateMonster=null;
private void ActivateMonster(){
int index = Random.Range(0,monsters.Length);
activateMonster=monsters[index];
activateMonster.SetActive(true);
activateMonster.GetComponent<BoxCollider>().enabled=true;
}
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TargetManager : MonoBehaviour { public GameObject[] monsters; public GameObject activeMonster = null; private void Start() { foreach(GameObject monster in monsters) { monster.GetComponent().enabled = false; monster.SetActive(false); } ActivateMonster(); } private void ActivateMonster() { int index = Random.Range(0,monsters.Length); activeMonster = monsters[index]; activeMonster.SetActive(true); activeMonster.GetComponent().enabled = true; } }
Json :读取游戏
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json"
if(File.Exists(filePath)) //判断文件是否存在
{
//创建一个StreamReader,用来读取流 StreamReader sr = new StreamReader(filePath);
//将读取到的流赋值给jsonStr
string jsonStr = sr.ReadToEnd();
//关闭
sr.Cloes();
}
else
{
}
Json 保存游戏
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();
[System.Serializble]
读取
//反序列化过程
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(Applicaton.dataPath + "/StreamingFile" + "/byBin.txt",FileMode.Open);
//调用格式化程序的反序列化方法,将文件流转换成一个Save对象
Save save = (Save)bf.Deserialize(fileStream);
//关闭流文件
fileStream.Close();
PlayerPrefs:数据持久化方案
采用键值对的方式对数据进行存储
可以存储int float string类型的数据
PlayerPrefs.SetInt("index",1);
PlayerPrefs.SetFloat("Height",183.5f);
PlayerPrefs.SetString("Name","Tom");
获取数据
PlayerPrefs.GetInt("Index");
游戏暂停
Time.timeScale = 0;
//鼠标是否可见
Cursor.visible = true;