实现游戏的存档以及读档

实现游戏的存读档有三个方式

  • 二进制方法
  • XML
  • JSON

对比

二进制方法:简单,但可读性差。
XML:可读性强,但是文件庞大,冗余信息多。
JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。

二进制方法(Binary Formatter)

序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。
反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象。

JSON:

是一种语言无关的发送和接收数据的常用格式。可以使用它来跨平台的传输数据。
JSON序列化:对象 JSON
JSON反序列化:JSON 对象

XML

扩展标记语言,用于标记电子文件使其具有结构性的标记语言。
可以用来标记数据、定义数据类型。
序列化与反序列化的方式与二进制方法十分类似。
http://blog.csdn.net/y1196645376/article/details/52541882

具体实现操作如下

创建save保存类,在unity下创建c#脚本save

public class save 
{
    public List<int> livingtargetposition = new List<int>();//存活敌人位置信息
    public List<int> livingmonstertype = new List<int>();//存活敌人类型信息
    public int shootnum = 0;//射击数
    public int score = 0;//得分数
            
}

还需要添加一句非常重要的代码。在类声明之上,添加:

[System.Serializable]

这是一个属性,它标明了代码的一个元数据。它告诉 Unity 这个类可以被序列化,这意味着你可以将它转换成字节流并保存到磁盘文件中。
在gamemanger中我们
创建Save对象并存储当前游戏状态信息

private Save CreateSaveGO()
    {
        //新建Save对象
        Save save = new Save();
        //遍历所有的target
        //如果其中有处于激活状态的怪物,就把该target的位置信息和激活状态的怪物的类型添加到List中
        foreach (GameObject targetGO in targetGOs)
        {
            TargetManager targetManager = targetGO.GetComponent<TargetManager>();
            if (targetManager.activeMonster != null)
            {
                save.livingTargetPositions.Add(targetManager.targetPosition);
                int type = targetManager.activeMonster.GetComponent<MonsterManager>().monsterType;
                save.livingMonsterTypes.Add(type);
            }
        }
        //把shootNum和score保存在Save对象中
        save.shootNum = UIManager._instance.shootNum;
        save.score = UIManager._instance.score;
        //返回该Save对象
        return save;
    }
//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)
    private void SetGame(Save save)
    {
        //先将所有的targrt里面的怪物清空,并重置所有的计时
        foreach(GameObject targetGO in targetGOs)
        {
            targetGO.GetComponent<TargetManager>().UpdateMonsters();
        }
        //通过反序列化得到的Save对象中存储的信息,激活指定的怪物
        for(int i = 0; i < save.livingTargetPositions.Count; i++)
        {
            int position = save.livingTargetPositions[i];
            int type = save.livingMonsterTypes[i];
            targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type);
        }

        //更新UI显示
        UIManager._instance.shootNum = save.shootNum;
        UIManager._instance.score = save.score;
      
    }

以二进制的方法保存游戏

 private void SaveByBin()//保存游戏
    {
        //序列化过程(将Save对象转换为字节流)
        //创建Save对象并保存当前游戏状态
        Save save = CreateSaveGO();
        //创建一个二进制格式化程序
        BinaryFormatter bf = new BinaryFormatter();
        //创建一个文件流
        FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");//文件位置和文件名,前面都需要加/
        //用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
        bf.Serialize(fileStream, save);
        //关闭流
        fileStream.Close();
        }

读取游戏

 private void LoadByBin()
    { //反序列化过程
            //创建一个二进制格式化程序
            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);
            }
            

//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)

 private void SetGame(Save save)
    {
        //先将所有的targrt里面的怪物清空,并重置所有的计时
        foreach(GameObject targetGO in targetGOs)
        {
            targetGO.GetComponent<TargetManager>().UpdateMonsters();
        }
        //通过反序列化得到的Save对象中存储的信息,激活指定的怪物
        for(int i = 0; i < save.livingTargetPositions.Count; i++)
        {
            int position = save.livingTargetPositions[i];
            int type = save.livingMonsterTypes[i];
            targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type);
        }
          //更新UI显示
         UIManager._instance.shootNum = save.shootNum;
        UIManager._instance.score = save.score;
        }
  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值