unity游戏中存档和读档的方法

摘要:
JSON序列化:对象JSONJSON反序列化:JSON对象XML扩展标记语言,用于将电子文件标记为具有结构标记语言。序列化和反序列化与二进制方法非常相似。它告诉Unity这个类可以序列化,这意味着您可以将其转换为字节流并将其保存到磁盘文件中。

参考文章:

https://blog.csdn.net/a1728351227/article/details/103638106

实现游戏的存读档有三个方式
二进制方法
XML
JSON
对比
二进制方法:简单,但可读性差。
XML:可读性强,但是文件庞大,冗余信息多。
JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。

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

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

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

unity游戏中存档和读档的方法第1张

具体实现操作如下创建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;//得分数            }12345678还需要添加一句非常重要的代码。在类声明之上,添加:
[System.Serializable]1这是一个属性,它标明了代码的一个元数据。它告诉 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;    }12345678910111213141516171819202122//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)    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;          }123456789101112131415161718192021以二进制的方法保存游戏
 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();        }1234567891011121314读取游戏
 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);            }            12345678910111213//通过读档信息重置我们的游戏状态(分数、激活状态的怪物)
 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;        }123456789101112131415161718
————————————————版权声明:本文为CSDN博主「a1728351227」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/a1728351227/java/article/details/103638106

免责声明:文章转载自《unity游戏中存档和读档的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇经典alsa 录音和播放程序使用spring-data-JPA调用存储过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

序列化 反序列化 MessagePack for C#

阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union Dynamic(Untyped)反序列化 Object 类型序列化 Typeless 性能 反序列化中每个方法的性能 LZ4压缩 与protobuf,JS...

Unity 切割导出精灵

Unity中经常使用到精灵,尤其是2D游戏中制作动画等!今天我们就学习下精灵的切割和导出吧! 废话不多说,先建议空的工程。 1,打开Unity建工程。 2 导入素材进行资源分类,工程不在于大小,这是我们对待它的态度! 3.开始分割精灵,三步走! 编辑精灵. 开始分割精灵 Apply一下,看下分割的精灵,0-9共9个。 贴精灵导出代码: using...

Unity 场景分页插件 World Streamer 支持无限大地图的解决方案(一)

翻译官方文档加上自己的一些理解。 参考:WorldStreamer官方文档。 目标:将我自己的WorldManager与WorldStreamer结合,让WorldStreamer支持开放世界建筑系统。   一、原理 创建虚拟grid,将大世界分成小块管理。设置一个“参照点”(通常是Player,如果是RTS,则是Camera),当参照点足够接近某个虚拟格...

JAVA 实现CLOB转String

CLOB 定义   数据库中的一种保存文件所使用的类型。   Character Large Object   SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(C...

ASP.NET 中实现会话状态的基础

简介 在 Web 应用程序这样的无状态环境中,了解会话状态的概念并没有实际的意义。尽管如此,有效的状态管理对于大多数 Web 应用程序来说都是一个必备的功能。Microsoft® ASP.NET 以及许多其他服务器端编程环境都提供了一个抽象层,允许应用程序基于每个用户和每个应用程序存储持久性数据。 需要特别注意的是,Web 应用程序的会话状态是应用程序在不...

oracle double和float,number 羽毛

float,double,number都是oracle的数值类型。1个汉子=2个英文=2个字节float表示单精度浮点数在机内占4个字节,用32位二进制描述。 double表示双精度浮点数在机内占8个字节,用64位二进制描述。 1、只有一个参数时,如NUMBER(24)。表示所定义的数字最大可设置24位整数。2、有两个参数时,如NUMBER(38, 3)。...