Files
ZHGD_Web/Assets/Script/Controller/ChartDataUpdateController.cs
2025-07-16 15:37:39 +08:00

233 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using TMPro;
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}";
}
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>
void PieUpdate(int index, BaseChart pie, string data, Text text, int plan, string format)
{
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)
{
text.text = string.Format("{0:" + format + "}%", (pie.series[index].data[plan].data[1] / sum) * 100);
}
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)
{
text.text = string.Format("{0:" + format + "}%", (ring.series[index].data[plan].data[0] / ring.series[index].data[plan].data[1]) * 100);
}
}
/// <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"; // 格式(小数点后位数)
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;
}
}