0

我几乎完成了我的基于文本的冒险游戏,并且正在尝试设置一个有效的保存/加载系统。我似乎无法做到这一点。

我查看了多个教程,我觉得 Json 可能是我需要的。不幸的是,我似乎无法让“加载”部分的 Json 代码正确。我还担心我要保存的数据量对于简单的序列化过程来说太多了,或者我过于复杂了,有一个更简单的解决方案。

这是我试图保存/加载的数据。如您所见,我有字典和列表,以及我试图保存的“房间”ScriptableObject,即保存游戏时玩家所在的 currentRoom。当前房间在 GameController 中被跟踪。

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

[System.Serializable]
public class SaveData
{
public Room saveRoomNavigation;
public List<string> saveNounsInInventory = new List<string>();
public List<InteractableObject> saveUseableItemList = new 
List<InteractableObject>();
public Dictionary<string, string> saveExamineDictionary = new 
Dictionary<string, string>();
public Dictionary<string, string> saveTakeDictionary = new 
Dictionary<string, string>();
public List<string> saveNounsInRoom = new List<string>();
public Dictionary<string, ActionResponse> saveUseDictionary = new 
Dictionary<string, ActionResponse>();


public SaveData (GameController controller, InteractableItems 
interactableItems)
{
    saveRoomNavigation = controller.roomNavigation.currentRoom;
    saveNounsInInventory = interactableItems.nounsInInventory;
    saveUseableItemList = interactableItems.useableItemList;
    saveExamineDictionary = interactableItems.examineDictionary;
    saveTakeDictionary = interactableItems.takeDictionary;
    saveNounsInRoom = interactableItems.nounsInRoom;
    saveUseDictionary = interactableItems.useDictionary;

}


}

然后这是我的保存系统代码,我正在尝试使用 Json 和二进制文件实现序列化。

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

public static class SaveSystem
{
public static void SaveGame (GameController controller, 
InteractableItems interactableItems)
{
    BinaryFormatter formatter = new BinaryFormatter();

    string path = Application.persistentDataPath + "/savegame.rta";
    FileStream stream = new FileStream(path, FileMode.Create);

    SaveData data = new SaveData(controller, interactableItems);

    var json = JsonUtility.ToJson(data);
    formatter.Serialize(stream, json);
    stream.Close();
}

public static SaveData LoadGame()
{
    string path = Application.persistentDataPath + "/savegame.rta";
    if (File.Exists(path))
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(path, FileMode.Open);

        SaveData data = 
JsonUtility.FromJsonOverwrite((string)formatter.Deserialize(stream, 
????));
        //SaveData data = formatter.Deserialize(stream) as 
SaveData;
        stream.Close();

        return data;

    }
    else
    {
        Debug.LogError("Save file not found in " + path);
        return null;
    }
}
}

我把'????' 上面是我似乎无法让它接受我试图覆盖的对象的地方,我认为它是“SaveData”,因为当玩家点击“加载”按钮时,这是我将信息拉入游戏的地方. 它告诉我“'SaveData' 是一种类型,在给定的上下文中无效”

这是我在使用“保存”和“加载”按钮时调用的代码,它位于我的 GameController 类中,在游戏播放期间跟踪大部分内容。

public void SaveGame()
{
    SaveSystem.SaveGame(this, interactableItems);
}

public void LoadGame()
{
    SaveData data = SaveSystem.LoadGame();

    roomNavigation.currentRoom = data.saveRoomNavigation;

    interactableItems.nounsInInventory = data.saveNounsInInventory;
    interactableItems.useDictionary = data.saveUseDictionary;
    interactableItems.takeDictionary = data.saveTakeDictionary;
    interactableItems.examineDictionary = 
    data.saveExamineDictionary;
    interactableItems.useableItemList = data.saveUseableItemList;
    interactableItems.nounsInRoom = data.saveNounsInRoom;


    DisplayRoomText();
    DisplayLoggedText();

}

在游戏中使用时,我收到“SerializationException”错误,所以我尝试尝试 Json。我读到它可以序列化比基本的 Unity 序列化器更多的地方。错误消失了,它似乎可以用 Json 保存,但现在我无法正确获取 Load 语法。

我是一个新手,所以也许我让这变得更难了……我也研究了 Userprefs,但我认为我不能将 Scriptable Object Room 转换为 String 类型。

提前致谢!

[更新] 这是我能够以 .txt 格式保存的内容。这证明它正在保存,只是不确定“instanceIDs”会给我需要的负载。

ˇˇˇˇö{"saveRoomNavigation": {"instanceID":11496},"saveNounsInInventory": ["sword"],"saveUseableItemList":[{"instanceID":11212}, {"instanceID":11588},{"instanceID": 10710},{"instanceID":11578}, {"instanceID":10718},{"instanceID":11388}, {"instanceID":11276}],"saveNounsInRoom":["rocks","hole"]}

4

1 回答 1

1

查看 Unity 内置 JsonUtility 的文档:

https://docs.unity3d.com/Manual/JSONSerialization.html

它说不支持诸如“字典”之类的类型。看起来好像您的 SaveData 示例中有多个字典,我是否建议您使用更强大的 JSON 库,例如 JSON.NET,它在资产商店是免费的:

https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347

于 2019-08-16T18:55:15.767 回答