Unity:从Json文件加载类实例给出ArgumentNullException

时间:2019-04-15 02:33:38

标签: json unity3d exception load instanceid

在我的游戏中,我有一个Computer类,其中包含以下变量:

 [System.Serializable]
 public class Computer : MonoBehaviour, ShopItem{
     public string model;
     public int price;
     public int speed;
     public int watt;
     public Sprite image;
 }

我有一个包含计算机列表的脚本:

   List<Computer> computerList;

然后,当我保存游戏时,我将所有数据传递给DataClass并将其转换为Json:

 public string SaveToJson(){
     //Create data class
     DataClass dataClass = new DataClass(...other parameters..., computerList);
     //Convert to json
     string jsonString = JsonUtility.ToJson(dataClass, false);
     //Save to PlayerPref
     PlayerPrefs.SetString("GameData", jsonString);
 }

我也将其存储到json文件中只是为了查看格式。 computerList包含一些instanceID,如下所示。

 "computerList": [
         {
             "instanceID": 655388
         },
         {
             "instanceID": 654696
         },
         {
             "instanceID": 655502
         },
         {
             "instanceID": 654696
         }
     ],

加载游戏时,我加载playerPref并将其转换回dataClass:

 public void LoadGame(){
     string result = PlayerPrefs.GetString("GameData");
     DataClass dataClass = JsonUtility.FromJson<DataClass>(result);  
     this.computerList = dataClass.computerList;
 }

但是当我尝试访问computerList时,它给了我这个错误:ArgumentNullException:参数不能为空。

我也将其保存在localhost数据库中,当我将其重新加载时,它也会出现相同的错误,因此我认为PlayerPrefs没错。其他变量如int,float,list效果很好,因此问题应该出在自定义类上。任何帮助将不胜感激。

完整的错误代码是:

ArgumentNullException: Argument cannot be null. Parameter name: key System.Collections.Generic.Dictionary`2[ShopItem,System.Int32].ContainsKey (ShopItem key) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:280) InventoryManager.ProcessItemList () (at Assets/Script/CoreGame/Local Manager/InventoryManager.cs:54) InventoryManager.ShowInvnetory () (at Assets/Script/CoreGame/Local Manager/InventoryManager.cs:89) UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:166) UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58) UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:66) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:108) UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update()

0 个答案:

没有答案