2016-08-18 14 views
-1

まず、 'id'、 'name'、 'isItem'、int、string、booleanなどの異なるフィールドを持つクラス 'item'をコード内に持っています。与えられたidから 'item'を作成する関数を作成したいと思います。この関数は、Excelなどのデータベースや手動で編集しやすいものでオブジェクトをフェッチする必要があります。ファイルからコンフィグレーション情報を読み込む

それは次のように次のようになります。そして、私のようなItemsContainerクラスを作成することによって、あなたの方法を試してみました Example of Excel Sheet easily editable

OK:

public class ItemsContainer : MonoBehaviour { 
    public item[] items; 
} 

その後、私は次のように解析してみました:

var json = System.IO.File.ReadAllText (Application.dataPath + "\\" + "json.txt"); 
ItemsContainer Items = JsonUtility.FromJson<ItemsContainer> (json); 

Dictionary<int, item> its = new Dictionary<int, item>(); 
its = Items.items.ToDictionary (x => x.id); 

しかし、それは私に与えるCannot deserialize JSON to new instances of type 'ItemsContainer.'私はなぜわからない。で作業する場合

public class item : MonoBehaviour { 

public int id; 
public string Name; 
public bool isItem; 

public item() { 
    Name = "Nothing"; 
    isItem = false; 
    } 
} 
+0

のようになります。いいですね。 Entity Frameworkについて聞いたことがありますか? – GolezTrol

+0

いいえ、私はそれを見てみましょうか? – Ay0m3

+0

Entity FrameworkがUnity3dで動作するかどうかわかりません。 .jsonファイル(そのテキストファイル)と[JsonUtility'クラス(http://docs.unity3d.com/Manual/JSONSerialization.html)]を使用して保存することを考えましたか? –

答えて

2

:JSONはJSONが

{ 
    "items": [ 
{ 
    "id": 1, 
    "Name": "Wood", 
    "isItem": true 
}, 
{ 
    "id": 2, 
    "Name": "Stone", 
    "isItem": true 
} 
] 
} 

のように見え、私のアイテムのクラスは次のように定義されて

...メモ帳であなたの「出力」の正確なコピーでありますこのような構成データは、.jsonファイル(テキストファイル)として保存し、the JsonUtility classを使用することをお勧めします。

JsonUtility.ToJson(yourClass, true)を設定すると、2番目のパラメータが「prettyPrint」になり、メモ帳などで簡単に編集できます。コードを使用していくつかの「プレースホルダ」アイテムを作成し、.ToJson()と呼んで最初のファイルを取得し、それを編集して残りを追加することができます。

[Serializable] 
public class MyItem 
{ 
    public int Id; 
    public string Name; 
    public bool isItem; 
} 

[Serializable] 
public class ItemsContainer 
{ 
    public MyItem[] items; 
} 

//elsewhere 
public void SaveTemplate() 
{ 
    List<MyItem> itemList = new List<MyItem>(); 
    itemList.Add(new MyItem { Id = 1, Name = "Wood", isItem = true }); 
    itemList.Add(new MyItem { Id = 2, Name = "Stone", isItem = true }); 

    ItemsContainer itemsContainer= new ItemsContainer(); 
    itemsContainer.items = itemList.ToArray(); 

    string json = JsonUtility.ToJson(itemsContainer, true); 
    YourFunctionToSaveTheTextSomewhere(json); 

} 

これはちょうど私が管理

public MyItem[] GetItems() 
{ 
    string json = GetJsonTextSomehow(); 
    ItemsContainer container = JsonUtility.FromJson<ItemsContainer>(json); 
    return container.items; 
} 

を行い、あなたが戻って取得し、その後に複数の項目を編集して追加することができます

{ 
    "items": [ 
    { 
     "Id": 1, 
     "Name": "Wood", 
     "isItem": true 
    }, 
    { 
     "Id": 2, 
     "Name": "Stone", 
     "isItem": true 
    } 
    ] 
} 

に似てJSONテキストを作成します。 jsonのテキストを持つことができますが、私はどのようにID 45を呼び出すことができ、その仕様からオブジェクトを作成できますか?そのために

アイテムのIDをキーとされた辞書の中にデータをロードしたいと思うでしょう、あなたのコードは、この

public class ItemManager : MonoBehavior 
{ 
    private Dictionary<int, MyItem> _itemDict; 

    public void Awake() 
    { 
     var items = GetItems(); 

     //Makes a new dictionary from the array using the field Id as the key. 
     _itemDict = items.ToDictionary(x => x.Id); 
    } 

    public MyItem GetItem(int itemId) 
    { 
     return _itemDict[itemId]; 
    } 

    private MyItem[] GetItems() 
    { 
     string json = GetJsonTextSomehow(); 
     ItemsContainer container = JsonUtility.FromJson<ItemsContainer>(json); 
     return container.items; 
    } 

    private string GetJsonTextSomehow() 
    { 
     //... 
    } 
} 
+0

私はそれをうまく動かすことができません、 "JSONをタイプ 'ItemsContainer'の新しいインスタンスに逆シリアル化できません。 " – Ay0m3

+0

@ Ay0m3は、あなたが使ったコードとそれをフィードバックしようとしているjsonであなたの質問を更新します。 –

+0

コメントを参照してください私は質問にしても、私の答えであなたの前のコメントを削除するには –

関連する問題