先写一个Save脚本用来存储你要保存的游戏内容(游戏内容一般都不一样,按照自己需求选):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable] //可序列化的
public class Save 
{
    public List<int> livingTargetPositions = new List<int>();
    public List<int> livingMonsterTypes = new List<int>();

public int shootNum = 0;
    public int score = 0;
}

在其它脚本上通过点击按钮响应脚本的方式实现保存(也可以直接边玩边保存)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using LitJson;
using System.Xml;

public GameObject[] targetGOs;

//创建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<MonstManager>().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)
    {
        //先将所有的target里面的怪物清空,并重置里面的计数
        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;
        //调整为未暂停状态 
        UnPause();
    }

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

xmlDoc.AppendChild(root);
        xmlDoc.Save(filePath);
        if (File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt"))
        {
            UIManager._instance.ShowMessage("保存成功");
        }

}

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("保存成功");

}

private void LoadByJson()
    {
        string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
        if(File.Exists(filePath))
        {
            //创建一个StreamReader,用来读取流
            StreamReader sr = new StreamReader(filePath);
            //将读取到的流赋值给josnStr
            string jsonStr = sr.ReadToEnd();
            //关闭
            sr.Close();

//将字符串jsonStr转换为Save对象
            Save save = JsonMapper.ToObject<Save>(jsonStr);
            SetGame(save);
            UIManager._instance.ShowMessage("");
        }
        else
        {
            UIManager._instance.ShowMessage("存档文件不存在");
        }
    }

unity存储系统(Save)相关推荐

  1. Unity Easy Save数据保存插件将数据保存到Android手机根目录

    Unity Easy Save数据保存插件将数据保存到Android手机根目录 原由 导入插件 设置保存路径 测试脚本 界面 测试验证 问题 原由 开发时碰到一个需求,两个手机APP,一个保存数据,一 ...

  2. 关于EMC Unity 存储系统DIMM内存的几个问题

    下面是客户咨询最多的几个关于EMC Unity的DIMM内存的问题,供大家参考. 1.  Unity存储能否自己扩容内存 有客户觉得Unity存储的内容太小,想自己扩容内存,很朴实的想法,原来是每个控 ...

  3. unity片元着色器中获取屏幕坐标_Unity踩坑笔记(持续更新)

    1.error CS0104: 'MinAttribute' is an ambiguous reference between 'UnityEngine.Rendering.PostProcessi ...

  4. 【贪玩巴斯】Unity3D初学圣经(三)—— unity中的基础概念——scene场景,component组件,assets文件夹和Material材质,Mesh Renderer与shader

    [贪玩巴斯]Unity3D初学圣经 三-- unity中的基础概念--scene场景,component组件与assets文件夹和Material材质以及Mesh Renderer 和 shader ...

  5. VRCHAT模型上传常见问题汇总

    ---------------------------------------------------------------------------------------------------- ...

  6. 播放器设置 Player Settings

    原地址:http://game.ceeger.com/Manual/class-PlayerSettings.html#Android Player Settings is where you def ...

  7. [Unity3d]Player Settings导出设置

    [Unity3d]Player Settings导出设置 分类:  Unity3D2013-12-22 14:25  413人阅读  评论(0) 收藏  举报 目录(?)[+] Player Sett ...

  8. Unity存档探索:PlayerPref、 Easy Save 2、Easy Save3

    PlayerPref 非常粗暴,直接使用键值对的方法存储,很适合小游戏使用(flappy bird之类) 在Windows平台下,PlayerPrefs被存储在注册表的 HKEY_CURRENT_US ...

  9. Unity完全学习教程-从初学者到C#中的RPG游戏开发

    打造3款游戏&学习Unity实用方式!从基础开始,以一个RPG游戏结束.使用Unity 2020和C# 你会学到: 通过创建酷游戏的实用方法 游戏开发的基础和核心概念 创建一个拥有大量功能的角 ...

最新文章

  1. 【c语言】蓝桥杯算法训练 大等于n的最小完全平方数
  2. IE6Bug,外层container设置了overflow:auto,但是内层嵌套元素有position:relative的时候,显示错误。...
  3. 笔记-中项案例题-2019年下-人力资源管理和冲突管理
  4. CSS 实现背景半透明
  5. 均质机工作原理动画_3D动画演示:有刷直流电机的工作原理
  6. 【java】父类与子类的引用赋值关系
  7. oracle之创建和管理表
  8. 专题:区块链与数据共享(下)
  9. 不记得撞得有多痛了,可是,那个电线杆,永远都在
  10. array in java,ArrayList to Array Conversion in Java
  11. bug篇——mysql版本不支持group by分组
  12. 2019/7/25 node.js
  13. BZOJ1486: [HNOI2009]最小圈
  14. 【生活相关】一(坚持)
  15. java.net.URLEncoder 、URLDecoder 编码与解码
  16. eclipse汉化.设置为中文 简单好操作 java初学者看过来
  17. 让Visio2007/2003支持UML2.2
  18. Qt 之 QQ系统表情(二)
  19. java 绘制点阵_[Java基础知识]点阵字库在JAVA中的实现
  20. 如果编程语言都是漂亮的小姐姐,你会喜欢哪一个?

热门文章

  1. 万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)
  2. 南京晓庄学院java实验五_南京晓庄学院实验小学
  3. 基于神经网络的微博情绪分类
  4. 中文句法分析及LTP使用
  5. Linux任务之自动发邮件
  6. 还在用通风放味除甲醛呢?专家教你三个小妙招,帮你轻松除甲醛!
  7. 容联领衔“科技金融50人”思辨 开启未来金融新征程
  8. 多个 Excel 批量设置页码信息
  9. 智能手机发布会上云,是“迫不得已”还是“刻不容缓”?
  10. 向左转移测试需要团队的努力