持久存储数据以统一学习应用程序

store data persistent for learn app with unity

我目前正在开发一个统一的语言学习应用程序。我想实现的是,当你猜错了一个作品(例如一个数字)时,你需要在下一次迭代中再次猜测这个词。我想到了一种方法,您可以在每种播放模式下为每个单词存储一个介于 +10 到 -10 之间的值,并且当一个项目具有较大的负数时,该单词出现的频率高于具有较大正数的单词。

我的问题是我不知道如何正确存储数据。 PlayerPrefs对于这个问题太不方便了,我不知道如何正确修改JSON文件

目前,我将项目的数据存储在 class 中。

也许你可以有这样的结构:

Numbers
   write
     zero: -5
     one: +3
   match
     zero: +5
     one: +4
Alphabet
   write:
     A: -10
   match: 
     A: +5

有人知道如何解决这个问题吗?

最好的 JSON 序列化库之一是 Newtonsoft.Json

您可以使用您的 class 并将对象序列化为 JSON 对象,然后将其作为字符串保存到文件中。

public static string Serialize(object obj)
{
    var settings = new JsonSerializerSettings
    {
        MissingMemberHandling = MissingMemberHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore
    };
    return JsonConvert.SerializeObject(obj, settings);
}

之后就可以保存到Application.persistentDataPath目录下的文件中了。

var text = Serialize(data);

var tmpFilePath = Path.Combine(Application.persistentDataPath, "filename");
Directory.CreateDirectory(Path.GetDirectoryName(tmpFilePath));
if (File.Exists(tmpFilePath))
{
    File.Delete(tmpFilePath);
}
File.WriteAllText(tmpFilePath, text);

之后您可以随时使用 File.ReadAllText 读取文件并将其反序列化为对象。

public static T Deserialize<T>(string text)
{
    var settings = new JsonSerializerSettings
    {
        MissingMemberHandling = MissingMemberHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore
    };
    
    try
    {
        var result = JsonConvert.DeserializeObject<T>(text, settings);
        return result ?? default;
    }
    catch (Exception e)
    {
        Debug.Log(e);
    }
    return default;
}
T result = default;
try
{
    if (File.Exists(path))
    {
        var text = File.ReadAllText(path);
        result = Deserialize<T>(text);
    }
}
catch (Exception e)
{
    Debug.LogException(e);
}
return result;

不幸的是,没有简单的方法可以在 Unity 中的游戏会话之间持久存储数据。 PlayerPrefs 和创建您自己的 JSON 文件是执行此操作的最简单方法。 好消息是 JSON 文件很容易制作和修改,这要归功于 Unity 提供的内置 JSONUtility

如果你制作一个单独的 class 或结构来保存你的分数,给那个类一个 [Serializable] 标签并在你当前的设置中保留对该标签的引用(可能是 MonoBehaviour).

您可以使用 File class (specifically File.CreateText() and File.OpenText()) 从文件写入 to/read。如果每次值更改时都这样做,您最终应该会在多个游戏会话中保存持久的数据。