Files
ZHGD_Web/Assets/Script/Controller/ChartDataUpdateController.cs

233 lines
7.0 KiB
C#
Raw Permalink Normal View History

2025-07-13 23:16:20 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
2025-07-16 15:37:39 +08:00
using TMPro;
2025-07-13 23:16:20 +08:00
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<ChartDataUpdateController>
{
/// <summary>
/// ChartUI刷新事件
/// </summary>
public UnityAction ChartUpdateAction;
public float time; // 刷新时间间隔
void Start()
{
InvokeRepeating("UpdateAction", 0, time);
}
/// <summary>
/// 触发刷新事件
/// </summary>
void UpdateAction()
{
ChartUpdateAction?.Invoke();
}
/// <summary>
/// ChartUI更新
/// </summary>
/// <param name="type">UI类型</param>
/// <param name="baseChart">UIChart载体</param>
/// <param name="index">UI层级</param>
/// <param name="data">更新数据Json</param>
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;
}
}
/// <summary>
/// 折线图更新
/// </summary>
/// <param name="index">UI层级</param>
/// <param name="line">折线图Chart载体</param>
/// <param name="data">更新数据Json</param>
void LineUpdate(int index, BaseChart line, string data)
{
List<LineData> lineData = JsonDataTool.Inst.JsonToOptionList<LineData>(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();
}
/// <summary>
/// 柱形图更新
/// </summary>
/// <param name="index">UI层</param>
/// <param name="bar">柱形图Chart载体</param>
/// <param name="data">更新数据Json</param>
IEnumerator BarUpdate(int index, BaseChart bar, string data)
{
if (bar.series[index].label != null)
{
bar.series[index].label.formatter = "{c:f2}";
}
2025-07-16 15:37:39 +08:00
2025-07-13 23:16:20 +08:00
List<BarData> barData = JsonDataTool.Inst.JsonToOptionList<BarData>(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 = "";
}
}
/// <summary>
/// 饼图更新
/// </summary>
/// <param name="index">UI层</param>
/// <param name="pie">饼图Chart载体</param>
/// <param name="data">更新数据Json</param>
2025-07-16 15:37:39 +08:00
void PieUpdate(int index, BaseChart pie, string data, Text text, int plan, string format)
2025-07-13 23:16:20 +08:00
{
List<PieData> pieData = JsonDataTool.Inst.JsonToOptionList<PieData>(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)
{
2025-07-16 15:37:39 +08:00
text.text = string.Format("{0:" + format + "}%", (pie.series[index].data[plan].data[1] / sum) * 100);
2025-07-13 23:16:20 +08:00
}
pie.series[index].animation.FadeIn();
}
/// <summary>
/// 环形图刷新
/// </summary>
/// <param name="index">UI层级</param>
/// <param name="ring">环形图Chart载体</param>
/// <param name="data">更新数据Json</param>
void RingUpdate(int index, BaseChart ring, string data, Text text, int plan, string format)
{
List<RingData> ringData = JsonDataTool.Inst.JsonToOptionList<RingData>(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)
{
2025-07-16 15:37:39 +08:00
text.text = string.Format("{0:" + format + "}%", (ring.series[index].data[plan].data[0] / ring.series[index].data[plan].data[1]) * 100);
2025-07-13 23:16:20 +08:00
}
}
/// <summary>
/// 雷达图刷新
/// </summary>
/// <param name="index">UI层级</param>
/// <param name="radar">雷达图Chart载体</param>
/// <param name="data">更新数据Json</param>
void RadarUpdate(int index, BaseChart radar, string data)
{
List<RadarData> ringData = JsonDataTool.Inst.JsonToOptionList<RadarData>(data);
radar.series[index].ClearData();
radar.GetChartComponent<RadarCoord>().indicator = false;
radar.GetChartComponent<RadarCoord>().indicatorList.Clear();
double[] d = new double[ringData.Count];
for (int i = 0; i < ringData.Count; i++)
{
d[i] = ringData[i].x;
radar.GetChartComponent<RadarCoord>().indicatorList.Add(new RadarCoord.Indicator() { name = ringData[i].name, max = 0 });
}
radar.series[index].AddData(d);
radar.GetChartComponent<RadarCoord>().indicator = true;
}
/// <summary>
/// 场景切换或停止运行时清空刷新事件
/// </summary>
private void OnDisable()
{
ChartUpdateAction = null;
}
}
/// <summary>
/// UI图类型
/// </summary>
public enum UIType
{
Line,
Bar,
Pie,
Ring,
Radar
}
/// <summary>
/// UI图更新数据
/// </summary>
[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"; // 格式(小数点后位数)
2025-07-16 15:37:39 +08:00
public Chart(UIType type, int index, string url, int plan, string format)
{
2025-07-13 23:16:20 +08:00
this.type = type;
this.index = index;
this.url = url;
this.plan = plan;
this.format = format;
}
}