簡體   English   中英

Unity中使用ScriptableObjects制作的基於文本的Adventure游戲中的保存/加載系統問題

[英]Issues with Save/Load System in a Text Based Adventure game made with ScriptableObjects in Unity

我的基於文本的冒險游戲幾乎完成了,並試圖設置一個有效的保存/加載系統。 我似乎無法做到這一點。

我看過多個教程,我覺得Json可能正是我所需要的。 不幸的是,我似乎無法正確獲取“加載”部分的Json代碼。 我還擔心我要保存的數據量對於一個簡單的序列化過程來說太多了,或者我對此過於復雜了,並且有一個更簡單的解決方案。

這是我正在嘗試保存/加載的數據。 如您所見,我有“詞典”和“列表”,還有一個我要保存的“ Room” ScriptableObject,即保存游戲時Player所在的currentRoom。 在GameController中跟蹤currentRoom。

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 Serializer進行序列化的地方更多。 錯誤消失了,似乎可以與Json一起使用,但是現在我無法正確獲取Load語法。

我是新手,所以也許我正在使它變得更困難,而必須這樣做……我也研究了Userprefs,但我認為我無法將可腳本編寫的對象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”]}

查看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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM