Unity Чернила/Чернила: Как загрузить сохраненный JSON состояния истории

#c# #unity3d #inkle-ink

Вопрос:

Итак, в нашей новой визуальной игре, использующей API чернил/чернил для unity, я пытаюсь реализовать систему сохранения и загрузки, но в настоящее время у меня возникают проблемы с загрузкой сохраненного состояния так, как я намереваюсь.

Основываясь на документации API, чтобы сохранить состояние вашей истории в игре, вы вызываете:

string savedJson = _inkStory.state.ToJson();

затем, чтобы загрузить его:

_inkStory.state.LoadJson(savedJson);

Вот как я сохраняю текущее состояние истории с помощью PlayerPrefs, что работает просто отлично.

 public void saveGame()
    {

     DialogueSystem dialogueSystem = GetComponent<DialogueSystem>();
    dialogueSystem.savedJson = dialogueSystem.dialogue.state.ToJson();
    PlayerPrefs.SetString("saveState", dialogueSystem.savedJson);
    
    Debug.Log(dialogueSystem.savedJson);

    }
 

и вот как я пытаюсь загрузить сохраненное состояние при запуске(), которое не загружает сохраненное состояние.

 private void Start()
    {
        dialogue = new Story(dialogueJSON.text);
        currentActiveBG = BGs[0]; 
        historyScript = GetComponent<History>();
        counterScript = GetComponent<counter>();
        
        if (PlayerPrefs.HasKey("saveState")) { // for loading the saved state

            dialogue = new Story(dialogueJSON.text);
            savedJson = PlayerPrefs.GetString("saveState");
            dialogue.state.LoadJson(savedJson);
            loadLine(); //this function contains story.Continue, which loads the next line
            Debug.Log(savedJson);
        }

        else {
            loadGame("Pre_Prep1"); // default starting line

        }

    }




How can I make this work? And is there a better way of implementing this save/load feature?
 

Ответ №1:

Я не уверен, какую игру вы собираетесь сделать, но я использую следующую систему сохранения в своем проекте, и она отлично работает, и вы также можете ее использовать.

 using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Saving System
public class UserData{
 #region Save Data Var's 
 // file Path
 private static readonly string FILE_PATH = Application.dataPath   
 "/SaveFiles";
 public  int carToLoad;
 public  int levelToLoad;
 public  int unlockLevels;
 #endregion

 #region Methods


 // Save
 public static void SaveData(string contents){ // for Car Selection 
     File.WriteAllText(FILE_PATH   "/UserData.txt",contents);
 }

 // Load
 public static UserData LoadData(){
    string _data = File.ReadAllText(FILE_PATH   "/UserData.txt");
    return JSONToUserData(_data);
 }

 // Init 
 public static void UserData_init(){
    CheckFilesPreviousData();
    CheckDirectory();
 }

 // Selection Level Data 
 public static void SaveData(UserData LevelData) { // for Level 
    UserData tempObj = LoadData();
    tempObj.levelToLoad = LevelData.levelToLoad;
    SaveData(UserDataToJSON(tempObj));
 }

 // UnLock Level Data
 public static void SaveUnLockedLevelData(int LevelValue){
    UserData tempObj = LoadData();
    tempObj.unlockLevels = LevelValue;
    File.WriteAllText(FILE_PATH   "/UnLockLevels.text", 
 UserDataToJSON(tempObj));
}

 // Load UnLock Level Data
 public static UserData LoadUnLockLevelData(){
    string _data= File.ReadAllText(FILE_PATH "/UnLockLevels.text");
    UserData tempObj = JSONToUserData(_data);
    return tempObj;
 }
 #endregion

#region Helper Methods
// !! important
 public static UserData JSONToUserData(string path) => 
  JsonUtility.FromJson<UserData>(path);// JSON to Obj
public static string  UserDataToJSON(UserData obj) => JsonUtility.ToJson(obj);// 
 Obj to JSON 

// Making Directory if not present
private static void CheckDirectory(){
    if (!Directory.Exists(FILE_PATH)){
        Directory.CreateDirectory(FILE_PATH);
    }
}

// Reset Data If User Play 1st Time
private static void CheckFilesPreviousData(){
    // Checking File is not Null
    UserData tempObj = LoadUnLockLevelData();
    if(tempObj == null){
        const int FIRSTLEVEL = 1;
        SaveUnLockedLevelData(FIRSTLEVEL);
        Debug.Log("Donee");
    }
    
}

#endregion
 

}