Json 文件
Json文件的存储:
存储在StreamingAssets目录下的:
//这里用了游戏配置表常用的Json存储格式-对象数组
{
"data":[
{
"id": 1001,
"name": "ScreenFront_1",
},
{
"id": 1002,
"name": "ScreenLeft_1",
},{
"id": 1003,
"name": "ScreenRight_1",
},{
"id": 1004,
"name": "ScreenBottom_1",
},{
"id": 1005,
"name": "Logo_1",
},]
}
Json文件的解析:
定义本地存储结构
定义本地数据结构,添加序列化标签[System.Serializable]
using System.Collections.Generic;
[System.Serializable]
public class ConfigData {
public bool debug { get; set; }
public bool debugConsole { get; set; }
public int logDeleteTime { get; set; }
public int debugLevel { get; set; }
public bool connectWs { get; set; }
public bool debugMultiPlayer { get; set; }
public bool allowSetCave { get; set; }
public int playerCount { get; set; }
public int noBodyTime { get; set; }
public float video360Volume { get; set; }
public float roiRadius { get; set; }
public bool allowClose { get; set; }
public int uiPlan { get; set; }
}
[System.Serializable]
public class ArrObject {
public string child { get; set; }
public int age { get; set; }
}
[System.Serializable]
public class ObjObject {
public string parent { get; set; }
public int age { get; set; }
}
public class AppData
{
public AppItem[] data;
}
public class AppItem
{
public string name;
public string description;
public string picture;
public string appName;
public string appUrl;
}
public class UIData
{
public UIElement[] data;
}
public class UIElement
{
public int id { get; set; }
public string name { get; set; }
}
反序列化Json到本地数据结构
void MergeJson()
{
// Merge all JSON files in the json folder
string jsonFolderPath = Application.streamingAssetsPath + "/json";
List<string> jsonFiles = new List<string>(Directory.GetFiles(jsonFolderPath, "*.json"));
foreach (string filePath in jsonFiles)
{
string fileName = Path.GetFileName(filePath).Split('.')[0];
switch (fileName)
{
case "config":
data = ReadJsonFile<ConfigData>(filePath);
break;
case "display":
display = ReadJsonFile<DisplayConfig.DisplayConfigData>(filePath);
break;
case "apps":
appsData = ReadJsonFile<AppData>(filePath);
break;
case "UIElements":
uiData = ReadJsonFile<UIData>(filePath);
break;
default:
break;
}
}
}
ReadJson 方法
public static T ReadJsonFile<T>(string filePath)
{
string readData = File.ReadAllText(filePath);
// 支持数组嵌套的情况
return JsonConvert.DeserializeObject<T>(readData);
}
JsonConvert.DeserializeObject(readData);
来自于Newtonsoft.Json 库
用于将参数中的字符串文本反序列化到T泛型的实例化数据结构。(可自定义序列化过程)
返回类型可空
运行时调用
可以将Merge()方法做成单例。在程序一开始时,显示的调用。
也可以在配置文件更新数据【热更新时】动态地去更新本地数据结构。
在本地数据结构不为空时,在其他模块拿到里面的数据。
例. 加载UI图片
1.实例化本地存储结构
private IList<UIElement> uiDataList;
uiDataList = new List<UIElement>(ConfigManager.Instance.uiData.data);
2.读取本地(已Merge过的数据)
public void InitializeImageByName(string targetName,int width,int height,GameObject targetObject)
{
foreach (var item in uiDataList)
{
if(item.name == targetName)
{
ResourcesManager.Instance.InitializeImageFromStreamingAssets(ResPath.StreamingUIDir, item.name, width, height,targetObject);
}
}
}
item.name 即访问到了
的name 属性。
后续从资源管理器加载对应UI资源即可。