c# - Unity + Ink/Inkle:如何加载保存的故事状态 JSON
问题描述
因此,在我们使用 ink/inkle API 进行统一的视觉小说游戏中,我正在尝试实现一个保存和加载系统,但我目前无法按照我想要的方式加载保存的状态。
根据 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);
}
这就是我如何尝试在 Start() 上加载保存的状态,它不会加载保存的状态。
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?
解决方案
我不确定你要制作哪个游戏,但我在我的项目中使用了以下保存系统,它运行良好,你也可以使用它。
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
}
推荐阅读
- android - 如何将来自其他开发者的应用程序的新版本发布到 Apple App Store 和 Google Play?
- windows - 是否使用 last modified 来确定文件是否可以传输?
- css - 将网站调整为移动设备时出现问题(Devtools 与真实)
- angular - 在inappbrowser上隐藏网页菜单
- python - 路线上的纸浆运输问题,而不是数量上的问题
- javascript - BufferGeometry 中各个顶点的不同大小
- cryptography - 使用 Palisade 库的同态加密
- unit-testing - 在没有实际数据库调用的情况下在具有 N 层的 Web api 中进行单元测试
- google-cloud-platform - 如何以编程方式将角色添加到云构建服务帐户?
- azure - 天蓝色管道 cron 未运行