233 lines
7.0 KiB
C#
233 lines
7.0 KiB
C#
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;
|
||
}
|
||
} |