Unity3d 读Json文件

先贴个基础的测试代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[System.Serializable]
public class JsonData
{
    public string panelTypeString;
    public string path;
}
    
[System.Serializable]
public class Item
{
    public List<JsonData> infoList;
}
    
public enum Type
{
    ItemMessage,
    SkillMessage,
}
public class UIPanelMgr : MonoBehaviour {

	void Start () {
        TextAsset itemAsset = Resources.Load<TextAsset>("Json/UIPanelType");
        Item jsonList = JsonUtility.FromJson<Item>(itemAsset.text);
        foreach (var it in jsonList.infoList)
        {
            Type name = (Type)System.Enum.Parse(typeof(Type), it.panelTypeString);
            string path = it.path;
            Debug.Log(name);
            Debug.Log(path);
        }
    }
	
	void Update () {


	}
}
/*
 json:


    {
  "infoList": [
    {
      "panelTypeString": "ItemMessage",
      "path": "UIPane/ItemMessagePanel"
    },
    {
      "panelTypeString": "SkillMessage",
      "path": "UIPane/SkillMessagePanel"
    }
  ]
}

    */


之后是这次写的主体逻辑代码

在最近的版本已经不需要json的插件了,U3D自带了一个JsonUtility类。

不过JsonUtility必须

[
        {
        "id": 1,
        "name": "血瓶",
        "type": "Consumable",
        "quality": "Common",
        "description": "这个是用来加血的",
        "capacity": 10,
        "buyPrice": 10,
        "sellPrice": 5,
        "hp": 10,
        "mp": 0,
        "sprite": "Sprites/Items/hp"
    },
    {
        "id": 2,
        "name": "蓝瓶",
        "type": "Consumable",
        "quality": "Common",
        "description": "这个是用来加蓝的",
        "capacity": 10,
        "buyPrice": 10,
        "sellPrice": 5,
        "hp": 0,
        "mp": 10,
        "sprite": "Sprites/Items/mp"
    }]

类似于这样的数组json文件解析, 必须返回一个object..所以解决的办法可以是类似于下面这样,先定义一个object类,之后再从中遍历的形式来解析。

{
  "inforList":
  [
        {
        "id": 1,
        "name": "血瓶",
        "type": "Consumable",
        "quality": "Common",
        "description": "这个是用来加血的",
        "capacity": 10,
        "buyPrice": 10,
        "sellPrice": 5,
        "hp": 10,
        "mp": 0,
        "sprite": "Sprites/Items/hp"
    },
    {
        "id": 2,
        "name": "蓝瓶",
        "type": "Consumable",
        "quality": "Common",
        "description": "这个是用来加蓝的",
        "capacity": 10,
        "buyPrice": 10,
        "sellPrice": 5,
        "hp": 0,
        "mp": 10,
        "sprite": "Sprites/Items/mp"
    }
  ]
}

u3d的代码解析部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CommonLib;
using System.Text;
using System.IO;


namespace ItemSystem
{

    [System.Serializable]
    public class JsonData
    {
        public string name;
        public string type;
        public string quality;
        public string description;
        public string sprite;
        public int capacity;
        public int buyPrice;
        public int sellPrice;
        public int id;

        public int hp;
        public int mp;

        public int strength;
        public int intellect;
        public int agility;
        public int stamina;
        public string euqipType;

    }

    [System.Serializable]
    public class ItemList
    {
        public List<JsonData> inforList;
    }

    public class InventoryMgr : Singleton<InventoryMgr>
    {
        private List<Item> itemList=new List<Item>();
        public void ParseItemJson()
        {
            TextAsset itemAsset=Resources.Load<TextAsset>("Json/Items");
            string itemsJson = itemAsset.text;
            ItemList list = JsonUtility.FromJson<ItemList>(itemsJson);
            foreach(var item in list.inforList)
            {
                //先解析公共属性
                Item.ItemType type =(Item.ItemType) System.Enum.Parse(typeof(Item.ItemType), item.type);
                Item.Quality quality = (Item.Quality)System.Enum.Parse(typeof(Item.Quality),item.quality);
                string description = item.description;
                string name = item.name;
                string sprite = item.sprite;
                int capacity = item.capacity;
                int buyPrice = item.buyPrice;
                int sellPrice = item.sellPrice;
                int id = item.id;
                Item myItem = null;
                switch (type)
                {
                    case Item.ItemType.Consumable:
                        int hp = item.hp;
                        int mp = item.mp;
                        myItem = new Consumable(id, name, type, quality, description, capacity, buyPrice, sellPrice, sprite, hp, mp);
                        break;
                    case Item.ItemType.Equipment:
                        int strengh = item.strength;
                        int agility = item.agility;
                        int intellect = item.intellect;
                        int stamina = item.stamina;
                        //myItem = new Equipment(id, name, type, quality, description, capacity, buyPrice, sellPrice, sprite,);
                        break;
                    case Item.ItemType.Weapon:
                        break;
                    case Item.ItemType.Material:
                        break;
                }
                if (myItem!=null)
                {
                    itemList.Add(myItem);
                    Debug.Log(myItem);
                }
            }
        }

    }
}

要注意的是:ItemList类中名称,必须与json文件中总的名称一致,否则无法解析

这个Mgr是个单例类,如果要运行,可自行改成单例 或者挂载调用。


猜你喜欢

转载自blog.csdn.net/qq_33951440/article/details/80461031
今日推荐