public class SliderData
{
public string SliderName;
public float Value;
}
public class ToggleData
{
public string ToggleName;
public int Option;
}
public class UIData
{
public List<SliderData> sliderdata = new List<SliderData>();
public List<ToggleData> toggledata = new List<ToggleData>();
}
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using KorxGame.common;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using LitJson;
namespace KorxGame
{
/// <summary>
///
/// </summary>
public class JsonData : MonoSingleton<JsonData>
{
public Slider[] allSliders;
public Toggle[] allToggles;
private Dictionary<string, Slider> dic_sliders = new Dictionary<string, Slider>();
private Dictionary<string, Toggle> dic_toggles = new Dictionary<string, Toggle>();
void Start()
{
Dic_UIAddAndExamine();
ReadJson();
}
Slider[] FindAllSlider()
{
Slider[] slides = transform.GetComponentsInChildren<Slider>();
return slides;
}//查找所有slider
Toggle[] FindAllToggle()// 查找所有toggle并且 toggleGroup为空时 记录 0:true 1:false
{
Toggle[] toggles = GetComponentsInChildren<Toggle>();
List<Toggle> toggleList = toggles.ToList();
for (int i = toggleList.Count -1; i >= 0; i--)
{
if (toggleList[i].group != null)
{
toggleList.Remove(toggleList[i]);
}
}
return toggleList.ToArray();
}
ToggleGroup[] FindAllToggleGroup()
{
ToggleGroup[] tg = GetComponentsInChildren<ToggleGroup>();
return tg;
}
void Dic_UIAddAndExamine() //检测所有ui是否重名 并添加到字典中
{
allSliders = FindAllSlider();
allToggles = FindAllToggle();
for (int i = 0; i < allSliders.Length; i++)
{
//检测slider重复名
if (dic_sliders.Keys.Contains(allSliders[i].name))
Debug.LogWarning("有重复slider名:" + allSliders[i]);
else
{
dic_sliders.Add(allSliders[i].name, allSliders[i]);
}
}
//检测toggle重复名
for (int i = 0; i < allToggles.Length; i++)
{
if (dic_toggles.Keys.Contains(allToggles[i].name))
Debug.LogWarning("有重复toggle名:" + allToggles[i]);
else
{
dic_toggles.Add(allToggles[i].name, allToggles[i]);
}
}
}
public void InitAllJsonData()//保存按钮的事件方法
{
UIData uidata = new UIData();
//Dictionary<string, Slider> dic_sliders = new Dictionary<string, Slider>();
if (!File.Exists(Application.dataPath + "/UIData.json"))
{
File.CreateText(Application.dataPath + "/UIData.json");
}
List<SliderData> sliderdatas = new List<SliderData>();
List<ToggleData> toggledatas = new List<ToggleData>();
for (int i = 0; i < allSliders.Length; i++)
{
SliderData sn = new SliderData();
sn.SliderName = allSliders[i].name;
sn.Value = allSliders[i].value;
if (!sliderdatas.Contains(sn))
{
uidata.sliderdata.Add(sn);
sliderdatas.Add(sn);
}
}
//检测toggle重复名
for (int i = 0; i < allToggles.Length; i++)
{
ToggleData td = new ToggleData();
td.ToggleName = allToggles[i].name;
td.Option = allToggles[i].isOn?0:1;
if (!toggledatas.Contains(td))
{
uidata.toggledata.Add(td);
toggledatas.Add(td);
}
}
//写入slider数据
string jsonData = "{\"SliderData\":[\n";
for (int i = 0; i < uidata.sliderdata.Count; i++)
{
if (i == uidata.sliderdata.Count - 1)
{
jsonData += JsonUtility.ToJson(uidata.sliderdata[i]) + "\n";
break;
}
jsonData += JsonUtility.ToJson(uidata.sliderdata[i]) + "\n,";
}
jsonData += "]";
//写入toggle数据 先判断list是否为空 ,每种情况格式不同,严格控制json数据格式
if (uidata.toggledata.Count != 0)
{
jsonData += ",\n\"ToggleData\":[\n";
for (int i = 0; i < uidata.toggledata.Count; i++)
{
if (i == uidata.toggledata.Count - 1)
{
jsonData += JsonUtility.ToJson(uidata.toggledata[i]) + "\n";
break;
}
jsonData += JsonUtility.ToJson(uidata.toggledata[i]) + "\n,";
}
jsonData += "]";
}
jsonData += "}";
StreamWriter sw = new StreamWriter(Application.dataPath + "/UIData.json");
sw.WriteLine(jsonData);
//注意写入数据以后关闭
sw.Close();
AssetDatabase.Refresh();//刷新 不写可以切换软件自动刷新
}
void ReadJson()
{
LitJson.JsonData jsondata = JsonMapper.ToObject(File.ReadAllText(Application.dataPath + "/UIData.json"));
for (int i = 0; i < jsondata["SliderData"].Count; i++)
{
//print(jsondata["SliderData"][i]["SliderName"] + ":" + jsondata["SliderData"][i]["Value"]);
//TODO:读取json到UI
double d = (double) jsondata["SliderData"][i]["Value"];
float value = Mathf.Round((float)d * 100) / 100;
dic_sliders[(string) jsondata["SliderData"][i]["SliderName"]].value = value;
}
for (int i = 0; i < jsondata["ToggleData"].Count; i++)
{
//print(jsondata["ToggleData"][i]["ToggleName"] + ":" + jsondata["ToggleData"][i]["Option"]);
int value = (int)jsondata["ToggleData"][i]["Option"];
dic_toggles[(string)jsondata["ToggleData"][i]["ToggleName"]].isOn = value==0?true:false;
}
}
void WriteJson_slider(Slider slider,float value)
{
LitJson.JsonData jsondata = JsonMapper.ToObject(File.ReadAllText(Application.dataPath + "/UIData.json"));
for (int i = 0; i < jsondata["SliderData"].Count; i++)
{
if (slider.name == (string)jsondata["SliderData"][i]["SliderName"])
{
jsondata["SliderData"][i]["Value"] = value;
StreamWriter sw = new StreamWriter(Application.dataPath + "/UIData.json");
sw.WriteLine(jsondata.ToJson());
//注意写入数据以后关闭
sw.Close();
AssetDatabase.Refresh();//刷新 不写可以切换软件自动刷新
}
}
}
void WriteJson_toggle(Toggle toggle, bool value)
{
LitJson.JsonData jsondata = JsonMapper.ToObject(File.ReadAllText(Application.dataPath + "/UIData.json"));
for (int i = 0; i < jsondata["ToggleData"].Count; i++)
{
if (toggle.name == (string)jsondata["ToggleData"][i]["ToggleName"])
{
jsondata["ToggleData"][i]["Option"] = value;
StreamWriter sw = new StreamWriter(Application.dataPath + "/UIData.json");
sw.WriteLine(jsondata.ToJson());
//注意写入数据以后关闭
sw.Close();
AssetDatabase.Refresh();//刷新 不写可以切换软件自动刷新
}
}
}
void AddListerner()
{
for (int i = 0; i < allSliders.Length; i++)
{
Slider slider = allSliders[i];
slider.onValueChanged.AddListener((float value)=>{WriteJson_slider(slider,value);} );
}
for (int i = 0; i < allToggles.Length; i++)
{
Toggle toggle = allToggles[i];
toggle.onValueChanged.AddListener((bool value) => { WriteJson_toggle(toggle, value); });
}
}
}
}