using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.UI; using UnityEngine.UIElements; using XCharts.Runtime; using Color = UnityEngine.Color; public class ChartDataUpdateController : Singleton { /// /// ChartUI刷新事件 /// public UnityAction ChartUpdateAction; public float time; // 刷新时间间隔 void Start() { InvokeRepeating("UpdateAction", 0, time); } /// /// 触发刷新事件 /// void UpdateAction() { ChartUpdateAction?.Invoke(); } /// /// ChartUI更新 /// /// UI类型 /// UIChart载体 /// UI层级 /// 更新数据(Json) public void ChartUpdate(UIType type, BaseChart baseChart, Chart chart, string data) { switch (type) { case UIType.Line: LineUpdate(chart.index, baseChart, data); break; case UIType.Bar: StartCoroutine(BarUpdate(chart.index, baseChart, data)); break; case UIType.Pie: PieUpdate(chart.index, baseChart, data, chart.text, chart.plan, chart.format); break; case UIType.Ring: RingUpdate(chart.index, baseChart, data, chart.text, chart.plan, chart.format); break; case UIType.Radar: RadarUpdate(chart.index, baseChart, data); break; } } /// /// 折线图更新 /// /// UI层级 /// 折线图Chart载体 /// 更新数据(Json) void LineUpdate(int index, BaseChart line, string data) { List lineData = JsonDataTool.Inst.JsonToOptionList(data); line.series[index].ClearData(); for (int i = 0; i < lineData.Count; i++) { line.series[index].AddData(lineData[i].x, lineData[i].y); line.series[index].UpdateDataName(i, lineData[i].name); } line.series[index].AnimationRestart(); } /// /// 柱形图更新 /// /// UI层 /// 柱形图Chart载体 /// 更新数据(Json) IEnumerator BarUpdate(int index, BaseChart bar, string data) { if (bar.series[index].label != null) { bar.series[index].label.formatter = "{c:f2}"; } List barData = JsonDataTool.Inst.JsonToOptionList(data); bar.series[index].ClearData(); for (int i = 0; i < barData.Count; i++) { int place = 0; if (barData[i].y.ToString().Contains(".")) { place = barData[i].y.ToString().Length - barData[i].y.ToString().Split('.')[1].Length; } bar.series[index].AddData(barData[i].x, Math.Round(barData[i].y, place)); } yield return new WaitForSeconds(0.5f); if (bar.series[index].label != null) { bar.series[index].label.formatter = ""; } } /// /// 饼图更新 /// /// UI层 /// 饼图Chart载体 /// 更新数据(Json) void PieUpdate(int index, BaseChart pie, string data,Text text, int plan,string format) { List pieData = JsonDataTool.Inst.JsonToOptionList(data); float sum = 0; pie.series[index].ClearData(); for (int i = 0; i < pieData.Count; i++) { pie.series[index].AddData(pieData[i].x, pieData[i].y); pie.series[index].UpdateDataName(i, pieData[i].name); sum += pieData[i].y; } if (plan >= 0 && text != null) { text.text = string.Format("{0:" + format + "}%", (pie.series[index].data[plan].data[1] / sum)*100); } pie.series[index].animation.FadeIn(); } /// /// 环形图刷新 /// /// UI层级 /// 环形图Chart载体 /// 更新数据(Json) void RingUpdate(int index, BaseChart ring, string data, Text text, int plan, string format) { List ringData = JsonDataTool.Inst.JsonToOptionList(data); ring.series[index].ClearData(); for (int i = 0; i < ringData.Count; i++) { ring.series[index].AddData(ringData[i].x, ringData[i].y); ring.series[index].UpdateDataName(i, ringData[i].name); } if (plan >= 0 && text != null) { text.text = string.Format("{0:"+ format +"}%", (ring.series[index].data[plan].data[0] / ring.series[index].data[plan].data[1]) * 100); } } /// /// 雷达图刷新 /// /// UI层级 /// 雷达图Chart载体 /// 更新数据(Json) void RadarUpdate(int index, BaseChart radar, string data) { List ringData = JsonDataTool.Inst.JsonToOptionList(data); radar.series[index].ClearData(); radar.GetChartComponent().indicator = false; radar.GetChartComponent().indicatorList.Clear(); double[] d = new double[ringData.Count]; for (int i = 0; i < ringData.Count; i++) { d[i] = ringData[i].x; radar.GetChartComponent().indicatorList.Add(new RadarCoord.Indicator() { name = ringData[i].name, max = 0 }); } radar.series[index].AddData(d); radar.GetChartComponent().indicator = true; } /// /// 场景切换或停止运行时清空刷新事件 /// private void OnDisable() { ChartUpdateAction = null; } } /// /// UI图类型 /// public enum UIType { Line, Bar, Pie, Ring, Radar } /// /// UI图更新数据 /// [Serializable] public class Chart { public UIType type; // UI图类型 public int index; // UI层级 public string url; // 更新数据源 public int plan = -1; // 用于显示进度的数据 public Text text; // 显示进度的UI public string format = "f0"; // 格式(小数点后位数) public Chart(UIType type,int index,string url,int plan,string format) { this.type = type; this.index = index; this.url = url; this.plan = plan; this.format = format; } }