持久存储数据以统一学习应用程序
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。如果每次值更改时都这样做,您最终应该会在多个游戏会话中保存持久的数据。
我目前正在开发一个统一的语言学习应用程序。我想实现的是,当你猜错了一个作品(例如一个数字)时,你需要在下一次迭代中再次猜测这个词。我想到了一种方法,您可以在每种播放模式下为每个单词存储一个介于 +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。如果每次值更改时都这样做,您最终应该会在多个游戏会话中保存持久的数据。