Unity加载Json文件的数据

1.在很多时候,我们有游戏物体需要加载时,我们一般考虑从配置文件下加载进来。所以我们今天介绍一下如何使用Json文件来存储数据并且加载进代码中。
首先要了解:
JsonUtility.fromjson:把Json信息转化为一个对象

JsonUtility.tojson:把一个对象转化为json信息

序列化:为了传输方便,将要传输的对象序列化为二进制的数据流,效率极高,接收时通过反序列化转化为对象,简而言之,序列化即对象转二进制,反序列化即二进制转对象

①首先准备一下Json文件

// Json文件
{
"infoList":
[
{"panelTypeString":"Skill",
"path":"Assets/UI/icon.prefab"
},
{
  "panelTypeString":"Task",
  "path":"Assets/UI/icon.prefab"
 }
]
}

检查是否正确可以上Json检验网检验。

②在这里我需要一个脚本来存放我要加载物体的类型(如果不需要加载类型,这个可以省略)

//这里需要加载UI面板的类型
public enum UIPanelType
{
    MainMenu,
    Task,
    Shop,
    Bag,
    Skill,
    System,
    ItemMessage
}

③接下来需要创建一个脚本UIPanelInfo进行序列化和反序列化,该脚本需要实现ISerializationCallbackReceiver这个序列化接口

// 进行反序列化和序列化
[Serializable]//一定要写,而且不能错
public class UIPanelInfo:ISerializationCallbackReceiver
{
[NonSerialized]//一定要写,而且不能错
//UI的类型
  public UIPanelType uiPanelType;
  //这里要和你的Json里命名一样,顺序也要一样,例如:"panelTypeString":"Skill"的panelTypeString
  public string panelTypeString;
  //UI的路径
  public string path;
  //反序列之前调用
  public void OnAfterDeserialize()
  {
  uiPanelType = (UIPanelType)Enum.Parse(typeof(UIPanelType), panelTypeString);//将反序列化的字符串类型转化为对应的枚举
  }
  //序列化之前调用该方法
public void OnBeforeSerialize()
{
}
}

④创建另外一个类UIPanelTypeJson来保存数据

[Serializable]
class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;//C#中集合和json的集合名字要一致,且需要标记上上序列化
}

⑤下面的类为将Json文件的数据加载进来

public class UIManager
{  
   //单例模式
   private static UIManager instance;
    public static UIManager GetInstacne
    {
    get
        {
            if(instance==null)
            {
                instance = new UIManager();
            }
            return instance;
        }
    }
    //存储加载进来数据的字典
    private Dictionary<UIPanelType, string> pannelPathDict;
    //构造私有化
    private UIManager()
    {
        ParseUIPanelTypeJson()//加载Json文件等操作
  }
void  ParseUIPanelTypeJson()
 {
 
if(pannelPathDict==null)
        {
            pannelPathDict = new Dictionary<UIPanelType, string>();
        }
        //加载json文件,json文件在Resources文件中
        TextAsset info = Resources.Load<TextAsset>("Json/UIPanelTypeJson");
       
        UIPanelTypeJson jsonObj = JsonUtility.FromJson<UIPanelTypeJson>(info.text);
        //将每个数据存储在字典中
        foreach (UIPanelInfo item in jsonObj.infoList)
        {
            pannelPathDict.Add(item.uiPanelType, item.path);
        }
        }
//测试是否成功把数据加载到unity中
public void Test()
    {
        string path;
        pannelPathDict.TryGetValue(UIPanelType.Skill,out path);
        Debug.Log(path);
    }

}

⑥我们要再创建一个脚本来启动加载json,因为之前的脚本都没有继承mono,所以无法通过unity查看

public class GameRoot : MonoBehaviour
{
void Start()
    {
        UIManager.GetInstacne.Test();
    }
}

在uinty里创建一个空物体,将脚本挂载上去,运行
,控制台输出结果
Unity加载Json文件的数据_第1张图片

如果有报空错误,可能是加载json的路径错了,或者是Resources文件夹名名不对,或者是json的内容格式错误,或者是没有序列化和反序列化。

你可能感兴趣的:(unity)