2016-08-18 197 views
-1

首先,我在我的代碼中有一個類'item',它具有不同的字段,例如'id','name','isItem',int,string和boolean。我想創建一個函數,從給定的id創建一個'item'。我希望這個函數能像Excel那樣獲取數據庫中的對象或者可以手動編輯的東西。從文件中讀取配置信息

這將是這樣的: Example of Excel Sheet easily editable

好的話,我通過創建一個ItemsContainer類喜歡嘗試用自己的方式:

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.'我不知道爲什麼。 JSON的是在一個記事本的「產出」的精確副本...

的JSON看起來像

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

而我的物品類別的定義爲:

public class item : MonoBehaviour { 

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

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

聽起來不錯。你聽說過實體框架嗎? – GolezTrol

+0

永不,我應該看看它嗎? – Ay0m3

+0

我不知道實體框架是否可以在Unity3d中使用。你有沒有考慮將它保存爲.json文件(它只是一個文本文件)並使用[JsonUtility'類(http://docs.unity3d.com/Manual/JSONSerialization.html)? –

回答

2

當工作像這樣的配置數據最好的方法是將它保存爲.json文件(它只是一個文本文件)並使用the JsonUtility class

如果你設置JsonUtility.ToJson(yourClass, true)第二個參數打開「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); 

} 

這將創建一個類似於

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

,您可以編輯和添加更多的項目則得到JSON文本您剛剛做

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

我管理有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

查看我對該問題所作的評論,同時刪除之前在我的答案中的評論以清理它 –