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