簡體   English   中英

Unity 5 GameObject 序列化

[英]Unity 5 GameObject serialization

我正在嘗試使用 Newtonsoft.Json 序列化整個游戲對象。 當我使用 JsonConvert 序列化對象時,它會引發錯誤:

    NotSupportedException: rigidbody property has been deprecated
    UnityEngine.GameObject.get_rigidbody () (at C:/buildslave/unity/build/Runtime/Export/UnityEngineGameObject_Deprecated.cs:23)
(wrapper dynamic-method) UnityEngine.GameObject.Getrigidbody (object) <IL 0x00006, 0x00073>
Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (object) (at Assets/JsonDotNet/Source/Serialization/DynamicValueProvider.cs:104)
Rethrow as JsonSerializationException: Error getting value from 'rigidbody' on 'UnityEngine.GameObject'.
Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (System.Object target) (at Assets/JsonDotNet/Source/Serialization/DynamicValueProvider.cs:108)
Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (Newtonsoft.Json.JsonWriter writer, System.Object value, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContract collectionValueContract) (at Assets/JsonDotNet/Source/Serialization/JsonSerializerInternalWriter.cs:338)

為什么會這樣?

這里有問題:

public object GetValue(object target)
    {
      try
      {
        if (_getter == null)
          _getter = DynamicReflectionDelegateFactory.Instance.CreateGet<object>(_memberInfo);

        return _getter(target);
      }
      catch (Exception ex)
      {
        throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex);
      }
    }

它是 DynamicValueProvider.cs 的一部分

我不知道 Newtonsoft.Json,但從錯誤消息來看 - GameObject 屬性rigidbody已在 Unity 5 中與其他一些常見屬性 getter 一起被棄用,請參見此處此處

所有對rigidbody調用都必須替換為GetComponent<Rigidbody>()

錯誤消息是虛假的。 這是因為 JsonConvert 通過處理所有屬性來執行序列化的方式。 哪個先失敗或多或少是隨機的。

真正的問題是從 MonoBehaviour 派生的類不能簡單地序列化。 您需要找到一種方法來序列化您感興趣的數據值,而不是整個類。

搜索“serialise MonoBehaviour”以獲得一些想法。 推薦的方法是使用 ScriptableObject。

我為解決這個問題所做的是讓 Newtonsoft 只序列化我感興趣的字段。要將要序列化的屬性“列入白名單”,您可以將 [JsonObject(MemberSerialization.OptIn)] 標記添加到您的類中,以及 [JsonProperty ] 到您感興趣的屬性。

但是,如果您的意圖是在 Monobehaviour 中序列化 Unity 的屬性,那么顯然這對您不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM