0%

Unity-使用JsonUtility读取JSON配置表

配置表设计

前提

  • JsonUtility 只能对类进行序列化和反序列化,不能直接对链表,数组直接进行序列化和反序列化,更不能对字典进行序列化和反序列化;
    • 对链表,数组进行序列化和反序列化,需要将其包装在一个类里面;
    • 对字典,需要转换成链表,数组,再进行序列化和反序列化。

JSON配置表相关设计如下:

  1. 对于单个 JSON 配置表都需要有对应的两个类:
    • 实体类,存储配置表中每一行数据;
    • 配置表类,用一个链表存储所有的实体类。
  1. JSON 格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"配置表类中的链表名字": [
{
"ID": 1,
"属性一": "值",
"属性二": "值"
},
{
"ID": 2,
"属性一": "值",
"属性二": "值"
},
{
"ID": 3,
"属性一": "值",
"属性二": "值"
}
]
}

示例

一个货物的配置表

  1. JSON 配置表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"goodsList": [
{
"ID": 1,
"Name": "Hat",
"Introduction": "A nice hat."
},
{
"ID": 2,
"Name": "Gloves",
"Introduction": "A Warm Gloves."
},
{
"ID": 3,
"Name": "Shoes",
"Introduction": "Tattered Shoes."
}
]
}
  1. 货物实体类
1
2
3
4
5
6
[System.Serializable]
public class Goods {
public int ID;
public string Name;
public string Introduction;
}
  1. 货物配置表类
1
2
3
4
5
6
using System.Collections.Generic;

[System.Serializable]
public class GoodsConfig {
public List<Goods> goodsList;
}

配置表读取

  1. 配置表放哪?
  • 游戏玩法相关,与游戏策划相关联的,可以影响游戏体验的。如,角色属性,物品属性之类的。放在 Resources 文件夹下。
  • 其他的,如,音量设置、亮度设置一类的,放在 StreamingAssets 文件夹下。

下面是一个后面示例中用到的 JSON 文件,GoodsConfig.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"goodsList": [
{
"ID": 1,
"Name": "Hat",
"Introduction": "A nice hat."
},
{
"ID": 2,
"Name": "Gloves",
"Introduction": "A Warm Gloves."
},
{
"ID": 3,
"Name": "Shoes",
"Introduction": "Tattered Shoes."
}
]
}
  1. 读取 Resources 文件夹下的配置表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ConfigReader.cs
using UnityEngine;

public class ConfigReader : MonoBehaviour {
void Start() {
// 加载 Resources 文件夹下的 JSON 文件
TextAsset textAsset = Resources.Load<TextAsset>("GoodsConfig");
string json = textAsset.text;

// 将 JSON 字符串反序列成对象
GoodsConfig goodsConfig = JsonUtility.FromJson<GoodsConfig>(json);

// 访问数据
foreach (Goods item in goodsConfig.goodsList) {
Debug.Log("ID:" + item.ID + ", Name:" + item.Name + ", Introduction:" + item.Introduction);
}
}
}
1
2
3
4
# 输出
ID:1, Name:Hat, Introduction:A nice hat.
ID:2, Name:Gloves, Introduction:A Warm Gloves.
ID:3, Name:Shoes, Introduction:Tattered Shoes.
  1. 读取 StreamingAssets 文件夹下的配置表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// ConfigReader.cs
using UnityEngine;

public class ConfigReader : MonoBehaviour {

void Start() {
// 加载 StreamingAssets 文件夹下的 JSON 文件
string path = "file://" + Application.streamingAssetsPath + "/GoodsConfig.json";
WWW www = new WWW(path);
if (www.error != null) {
Debug.LogError("error : " + path);
}
// 等待文件读取
while (!www.isDone) { }

string json = www.text;

// 将 JSON 字符串反序列成对象
GoodsConfig goodsConfig = JsonUtility.FromJson<GoodsConfig>(json);

// 访问数据
foreach (Goods item in goodsConfig.goodsList) {
Debug.Log("ID:" + item.ID + ", Name:" + item.Name + ", Introduction:" + item.Introduction);
}
}
}
1
2
3
4
# 输出
ID:1, Name:Hat, Introduction:A nice hat.
ID:2, Name:Gloves, Introduction:A Warm Gloves.
ID:3, Name:Shoes, Introduction:Tattered Shoes.
  • Resources 文件夹里的资源通过 Resources 类加载。
  • StreamingAssets里的资源通过 WWW 类加载。