概述
本篇博客作为上一篇文章【Unity2D案例学习——背包系统制作】()的补充内容,同样来自b站up主M_Studio
在之前的制作中,该项目已经可以实现在Unity引擎中的正常运作——玩家可以收集场景物品到背包中,在背包中拖拽调整物品的位置,并在数据库文件中保存这些操作数据。但将游戏导出后,运行时所作的操作并不能保存到下一次游戏的开启。因此我们需要学习保存和读取ScriptableObject
通过脚本完成数据存储和加载
1.新建一个空物体GameSaveManager,用来承载游戏保存的任务
2.新建脚本GameSaveManager,在其中编写相关方法来实现游戏数据的存储和加载。下面是具体的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;//使用输入输出流
using System.Runtime.Serialization.Formatters.Binary;//二进制序列化
public class GameSaveManager : MonoBehaviour
{
public Inventory myInventory;
public void SaveGame()
{
Debug.Log(Application.persistentDataPath);//显示游戏文件存储路径
if (!Directory.Exists(Application.persistentDataPath + "/game_SaveData"))//若路径下不存在指定文件夹
{
Directory.CreateDirectory(Application.persistentDataPath + "/game_SaveData");//创建指定文件夹
}
BinaryFormatter formatter = new BinaryFormatter();//二进制序列化
FileStream file = File.Create(Application.persistentDataPath + "/game_SaveData/inventory.txt");//创建存储文件inventory
var json = JsonUtility.ToJson(myInventory);//将ScriptableObject(只读)转换为Json存储方法
formatter.Serialize(file, json);//将json序列化到file中
file.Close();//关闭文件流
}
public void LoadGame()
{
BinaryFormatter bf = new BinaryFormatter();
if (File.Exists(Application.persistentDataPath + "/game_SaveData/inventory.txt"))//若指定文件存在
{
FileStream file = File.Open(Application.persistentDataPath + "/game_SaveData/inventory.txt",FileMode.Open);//打开指定文件
//通过JsonUtility中的方法重写Inventory
JsonUtility.FromJsonOverwrite((string)bf.Deserialize(file), myInventory);//将存储的数据反序列化并重写到Inventory中
file.Close();
}
}
}
在上面的代码中,我们使用了C#中相关的序列化方法来实现游戏数据的存储。
首先,我们引用了需要存储的游戏数据对象:
如果是常规的类,只需要通过简单的序列化方法即可完成存储以及加载。但Inventory继承自ScriptableObject,因其特性无法直接进行序列化,故需要借助特定的方法将之转化为可序列化文件,以及通过这样的可序列化文件改写回来:
解决了ScriptableObject的存储和加载问题后,只需要借助C#中的序列化相关方法完成数据的存取就实现了对ScriptableObject的处理
我们可以在游戏中添加两个按钮来调用存储和加载游戏的方法:
这样导出游戏后,就可以简单的完成数据保存了