从文件中读取配置信息

时间:2016-08-18 16:16:43

标签: c# unity3d

首先,我有一个课程'项目'在我的代码中有不同的字段,例如' id',' name',' isItem',int,string和boolean。我想创建一个创建一个'项目的功能。来自一个id。我想要这个函数来获取像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;
    }
}

1 个答案:

答案 0 :(得分: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);

}

这将创建看起来类似于

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

您可以编辑并添加更多项目,然后再回来

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()
    {
       //...
    }
}