本地存档及读档

写一个关于本地存档和读档的文档,本文档包含了使用二进制,xml,json以及PlayerPrefs来进行存档和读档。注意,使用json的时候,要先把litjson.dll文件添加到项目中。
1,首先定义一个可以序列化的类,存储游戏信息,比如:

[System.Serializable]//用于序列化,必加
public class Save
{
    public int id= 0;
    public int score = 0;
}

2,接下来在另外一个类中写存储和读取的方法,

//创建Save对象并存储当前游戏状态信息
private Save CreateSaveGO()
{
    //新建Save对象
    Save save = new Save();
//把shootNum和score保存在Save对象中
//对Save对象中信息进行赋值
    save.shootNum = UIManager._instance.shootNum;
    save.score = UIManager._instance.score;
    //返回该Save对象
    return save;
}
//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)
private void SetGame(Save save)
{
//更新UI显示
//将Save对象中信息的值赋值给所需物体
    UIManager._instance.shootNum = save.shootNum;
    UIManager._instance.score = save.score;
    //调整为未暂停状态
    UnPause();
}

3,重点代码

//二进制方法:存档
private void SaveByBin()
{
    //序列化过程(将Save对象转换为字节流)
    //创建Save对象并保存当前游戏状态
    Save save = CreateSaveGO();
    //创建一个二进制格式化程序
    BinaryFormatter bf = new BinaryFormatter();
    //创建一个文件流,Application.dataPath 是项目路径
    FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
    //用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
    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();
    root.AppendChild(shootNum);

    XmlElement score = xmlDoc.CreateElement("score");
    score.InnerText = save.score.ToString();
    root.AppendChild(score);

    xmlDoc.AppendChild(root);
    xmlDoc.Save(filePath);

    if(File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt"))
    {
        UIManager._instance.ShowMessage("保存成功");
    }
}
//xml:读档
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("保存成功");
}
//json:读档
private void LoadByJson()
{ 
    string filePath = Application.dataPath + "/StreamingFile" + "/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(jsonStr);
        SetGame(save);
        UIManager._instance.ShowMessage("");
    }
    else
    {
        UIManager._instance.ShowMessage("存档文件不存在");
    }
}

4,最后是PlayerPrefs:

PlayerPrefs可以保存三种数据,分别是int,float,string,采用键值对的方式,比如:PlayerPrefs.SetInt("MusicOn", 0);

PlayerPrefs.SetString("xian","jian");

然后要使用PlayerPrefs.Save()方法进行保存。读取的时候首先检查PlayerPrefs中是否保存了你要读取的数据,如果有,再进行读取使用,代码如下:

//首先检查PlayerPrefs中是否保存了MusicOn值
if (PlayerPrefs.HasKey("MusicOn"))
{
    if(PlayerPrefs.GetInt("MusicOn") == 1)
    {
        musicToggle.isOn = true;
        musicAudio.enabled = true;
    }
    else
    {
        musicToggle.isOn = false;
        musicAudio.enabled = false;
    }
}

 

你可能感兴趣的:(unity)