我想知道将ScriptableObjects列表保存到Json的最佳方法是什么。我目前正在使用Newtonsoft.Json的方式进行操作,并给我一个警告,因为从Json加载数据的方式是使用“ new ScriptObject”而不是“ ScriptableObject.CreateInstance”方法创建scriptableObjects的实例。这只是一个警告,我看不到任何重大错误,但这仍然引起了我的兴趣。
谢谢。
答案 0 :(得分:2)
最好使用JsonUtility。 JsonUtility是一个统一类,具有用于处理JSON数据的实用程序功能。
您可以将FromJsonOverwrite(字符串json,对象objectToOverwrite)用于ScriptableObjects和MonoBehaviours。
您不应使用new关键字来创建或实例化scriptableObjects和monoBehaviours。因此,JsonUtility比其他标准的.net json库(例如Newtonsoft)更适合monoBehaviours和scriptableObjects。
答案 1 :(得分:0)
我绝对建议使用Newtonsoft版本(JsonDotNet)
Unity版本有太多问题。当我切换到Newtonsoft版本时,事情变得如此简单。
您可以简单地说要序列化
string jsonString = JsonConvert.SerializeObject(obj);
或者您可以通过这样做简单地反序列化
MyClass obj = JsonConvert.DeserializeObject<MyClass>(jsonString);
答案 2 :(得分:0)
嗯,也许这是错误的方法,但是出于我的目标,我将自己的可脚本化对象列表的序列化/反序列化写入json,因为我将所有球员数据(球员位置,库存,任务)存储在服务器上的单个文本字段中,保存/加载简单。而且,我使用WebGL构建,所以我不知道Newtonsoft在不同平台上的表现。而且我也不想对此进行测试)
private string SerializeSOList<T>(List<T> SO_List)
{
string result = "";
foreach (T item in SO_List)
{
result += JsonUtility.ToJson(item) + ", ";
}
return result;
}
private List<T> DeserializeSOList<T> (string json_string)
{
string[] stringSeparators = new string[] { "}," };
List<T> result = new List<T>();
string[] splitted = json_string.Split(stringSeparators, System.StringSplitOptions.None);
for(int i =0; i < splitted.Length-1; i++)
{
string SO_string = splitted[i] + "}";
Debug.Log(SO_string);
T itemBasic = (T)System.Activator.CreateInstance(typeof(T));
JsonUtility.FromJsonOverwrite(SO_string, itemBasic);
result.Add(itemBasic);
}
return result;
}
然后,您只需为任何可编写脚本的对象调用此函数,如下所示:
[SerializeField] public List<ItemBasic> basicUpgrades = new List<ItemBasic>();
string json_basicUpgrades = SerializeSOList(basicUpgrades);
basicUpgrades = DeserializeSOList<ItemBasic>(json_basicUpgrades);