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 folderstring 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资源即可。