【问题标题】:ScriptableObject List to JsonScriptableObject 列表到 Json
【发布时间】:2020-05-24 17:45:09
【问题描述】:

我想知道将 ScriptableObjects 列表保存到 Json 的最佳方法是什么。我目前正在使用 Newtonsoft.Json 的方式来做这件事,并给我一个警告,因为从 Json 加载数据的方式是使用“new ScriptObject”而不是“ScriptableObject.CreateInstance”方法创建 scriptableObjects 的实例。这只是一个警告,我没有看到任何重大错误,但它仍然引起了我的兴趣。

谢谢。

【问题讨论】:

  • 虽然有点老我用JSONObject
  • loading data from the Json is creating instances of the scriptableObjects ... 那么您对ScriptableObject List to Json 的问题是在标题中还是相反?

标签: unity3d


【解决方案1】:

最好使用 JsonUtility。 JsonUtility 是一个具有用于处理 JSON 数据的实用函数的统一类。

您可以将 FromJsonOverwrite(string json, object objectToOverwrite) 用于 ScriptableObjects 和 MonoBehaviours。

您不应使用 new 关键字来创建或实例化 scriptableObjects 和 monoBehaviours。因此 JsonUtility 比其他标准 .net json 库(如 Newtonsoft)更适合用于 monoBehaviours 和 scriptableObjects。

JsonUtility Unity3D

【讨论】:

  • 或者如果你想要一些额外的定制,我推荐JsonDotNet。您必须为 Unity 对象编写转换器(否则它会尝试序列化所有内容,并且由于只读属性而无法反序列化),但是当您需要额外的功能时,它会很棒。
  • 我遇到了 JsonUtility 的问题,比如 Lists 丢失了它的内容,我拥有东西的方式可能让那个库很难。我坚持使用 Newtonsoft,因为到目前为止我还没有发现错误。
  • 您需要将列表作为字段添加到类中。对字段使用 [SerializeField],对类使用 [System.Serializeable]。
【解决方案2】:

我绝对建议使用 Newtonsoft 版本 (JsonDotNet)
Unity版本有很多问题。当我切换到 Newtonsoft 版本时,事情变得容易多了。

你可以简单地说序列化

string jsonString = JsonConvert.SerializeObject(obj);

或者您可以通过这样做简单地反序列化

MyClass obj = JsonConvert.DeserializeObject<MyClass>(jsonString);

【讨论】:

    【解决方案3】:

    好吧,也许它的方法是错误的,但为了我的目标,我将我自己的 Scriptable 对象列表的序列化/反序列化写入 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;
        }
    

    然后您只需为任何 Scriptable 对象调用此函数,如下所示:

    [SerializeField] public List<ItemBasic> basicUpgrades = new List<ItemBasic>();
    
        string json_basicUpgrades = SerializeSOList(basicUpgrades);
    
        basicUpgrades = DeserializeSOList<ItemBasic>(json_basicUpgrades);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多