using System.Collections.Generic; using UnityEngine; namespace XericLibrary.Runtime.Chart { /// /// 折线图图表组件。 /// /// 继承 ChartMainBehaviour,是"开箱即用"的折线图表。 /// 功能上相当于一个完整的折线图控件,集成背景网格和折线渲染。 /// /// 自动执行以下初始化: /// 1. 创建 LineChartDataModel 数据模型 /// 2. 添加 ChartToolAxisBgUgui(背景网格,order=-100) /// 3. 添加 ChartToolLineUgui(折线渲染,order=0) /// 4. 数据模型绑定到所有工具 /// [AddComponentMenu("Xeric Library/Chart/Line Chart", 11)] public class XLineChart : ChartMainBehaviour { [Header("Line Chart 设置")] [SerializeField] private Color m_LineColor = new Color(0.33f, 0.67f, 1f, 1f); [SerializeField] private float m_LineThickness = 4f; [SerializeField] private Vector4 m_Margin = new Vector4(50f, 40f, 20f, 20f); [SerializeField] private int m_VisibleItemCount = 100; [SerializeField] private bool m_SmoothLine; public ChartToolAxisBgUgui AxisTool { get; private set; } public ChartToolLineUgui LineTool { get; private set; } private void Start() { DataModel = new LineChartDataModel(); AxisTool = AddTool("ChartTool_AxisBgUgui", -100); if (AxisTool != null) { AxisTool.DataModel = DataModel; AxisTool.SetViewRange(0, ChartViewRange.Recent(m_VisibleItemCount)); AxisTool.SetViewRange(1, ChartViewRange.ValueMode(-100f, 100f)); var bgImg = AxisTool.BackgroundImage; if (bgImg != null) { var rt = bgImg.rectTransform; rt.offsetMin = new Vector2(m_Margin.x, m_Margin.y); rt.offsetMax = new Vector2(-m_Margin.z, -m_Margin.w); } } LineTool = AddTool("ChartTool_LineUgui", 0); if (LineTool != null) { LineTool.DataModel = DataModel; LineTool.SetViewRange(0, ChartViewRange.Recent(m_VisibleItemCount)); LineTool.SetViewRange(1, ChartViewRange.ValueMode(-100f, 100f)); LineTool.LineColor = m_LineColor; LineTool.LineThickness = m_LineThickness; LineTool.Margin = m_Margin; LineTool.SmoothLine = m_SmoothLine; } } private void OnValidate() { if (LineTool != null) { LineTool.LineColor = m_LineColor; LineTool.LineThickness = m_LineThickness; LineTool.Margin = m_Margin; LineTool.SmoothLine = m_SmoothLine; } } public void AddPoint(double x, double y) => (DataModel as LineChartDataModel)?.AddPoint(x, y); public void SetPoints(IReadOnlyList xValues, IReadOnlyList yValues) => (DataModel as LineChartDataModel)?.SetPoints(xValues, yValues); public void SetYValues(IReadOnlyList yValues) => (DataModel as LineChartDataModel)?.SetYValues(yValues); public void ClearData() => DataModel?.ClearAll(); } }