unity利用Json储存和加载游戏

我的上一篇博客介绍了简单的背包系统 然后这篇博客结合上一篇的背包系统
来实现一下储存和加载点这里背包系统

我们现在游戏中添两个按钮 分别是保存和加载
我的这里的加载的意思是加载上次保存的进度

我先把代码给大家贴出来 然后在进行解释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;//转为二进制文件
public class GameSaveManmager : MonoBehaviour
{
    public Inventory MyInventory;//背包系统中的背包
    public Item itemgroup;//背包系统中的装备
     public void SaveGame()
    {
        //保存游戏
        Debug.Log(Application.persistentDataPath);//输出路径
         
        if(!Directory.Exists(Application .persistentDataPath + "/game_saveDate"))
        {
            //没有上边文件夹 创建
            Directory.CreateDirectory(Application.persistentDataPath + "/game_saveDate");
        }
         BinaryFormatter formatter = new BinaryFormatter();//转换为二进制
        FileStream file = File.Create(Application.persistentDataPath + "/game_saveDate/inventory.txt");//其中的类型是可以自定义的
        
        var json = JsonUtility.ToJson(MyInventory);//转换为二进制
        var json2 = JsonUtility.ToJson(itemgroup);//转换为二进制
        
        formatter.Serialize(file, json);//写入文件夹中
        formatter.Serialize(file, json2);//写入文件夹中
        file.Close();//文件关闭(保存)
     }
      public void LoadGame()
    {
        //加载
        BinaryFormatter bf = new BinaryFormatter();
        //反序列化
        if(File.Exists(Application.persistentDataPath + "/game_saveDate/inventory.txt"))
        {
            FileStream file = File.Open(Application.persistentDataPath + "/game_saveDate/inventory.txt",FileMode.Open );
            //转换为json
            JsonUtility.FromJsonOverwrite((string)bf.Deserialize(file), MyInventory);
            JsonUtility.FromJsonOverwrite((string)bf.Deserialize(file), itemgroup);
            file.Close();
        }
    }
}

之后还有重要的一步 就是要在控制背包显示的代码中添加一句

 if(Input.GetKeyDown(KeyCode.P))
        {
            isEquip = !isEquip;
            InventoryManager.RefreshItem();
        }

下一步我们给unity的两个按钮分别赋值 保存按钮的对应SaveGame() 保存按钮对应LoadGame()
然后 代码中注释我写很明白
** Debug.Log(Application.persistentDataPath);//输出路径**我们可以根据这句在unity的输出窗口来查看路径
在这里插入图片描述
然后运行游戏点击Save按钮的时候 我们按着这个路径找下去
在这里插入图片描述
可以看到这个文件夹
然后因为我们代码中创建了文件

 FileStream file = File.Create(Application.persistentDataPath + "/game_saveDate/inventory.txt");//其中的类型是可以自定义的

我们打开这个文件会发现

在这里插入图片描述
这和我们创建的类型还有名称都一致

这样添加完脚本之后我们可以发现在保存之后 不管在捡到什么装备 一旦点击加载 所有数据就会回到保存时的数据

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200414102640146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMjYwMg==,size_16,color_FFFFFF,t_70
在这里插入图片描述
按下保存 在捡装备
在这里插入图片描述
按下加载

在这里插入图片描述
我们可能发现是一个问题
就是每个装备都有个数 只有在上边声明的装备个数才会保存
我也尝试过用数组来解决 但是 会出现意料之外的BUG
所以如果想用的话 可以多声明几个装备
之后如果我解决之后 我会在这里更新出来

如果你也是unity开发爱好者 欢迎关注我的博客 我会在这里持续更新我的学习过程
最后祝大家 头发浓密 睡眠良好 财富自由

发布了88 篇原创文章 · 获赞 101 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/105505905