15555人加入学习
(100人评价)
通过实例学习:游戏的存档与读档(Unity 2017.2)

制作完成于2018-1-12

价格 免费

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();

[展开全文]

读取

//反序列化过程

//创建一个二进制格式化程序

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;

[展开全文]

1 讲了一个关于json和XML的博客里边有详细的使用

2 大致演示了二进制、XML和Json的大结构。

[展开全文]

授课教师

SIKI学院老师

课程特色

图文(1)
下载资料(1)
视频(34)