using Assets.Scripts.Utils; using System.Collections; using UnityEngine; #if INPUT_SYSTEM_ENABLED using Input = XCharts.Runtime.InputHelper; #endif using XCharts.Runtime; //[DisallowMultipleComponent] //[ExecuteInEditMode] public class Line_PHY_X : MonoBehaviour { private LineChart chart; void Awake() { } private void Start() { Init(); StartCoroutine(UpdatePos()); } private IEnumerator UpdatePos() { while (true) { chart.RemoveData(); chart.AddSerie<Line>(); for (int i = 0; i < ModelData.Phy_X.Count; i++) { chart.AddXAxisData("x" + i); chart.AddData(0, ModelData.Phy_X[i]); } ModelData.Phy_X.Clear(); yield return new WaitForSeconds(1f); } } void Init() { chart = gameObject.GetComponent<LineChart>(); if (chart == null) { chart = gameObject.AddComponent<LineChart>(); chart.Init(); } chart.EnsureChartComponent<Title>().show = true; chart.EnsureChartComponent<Title>().text = "物理端X 轴"; chart.EnsureChartComponent<Tooltip>().show = true; chart.EnsureChartComponent<Legend>().show = false; var xAxis = chart.EnsureChartComponent<XAxis>(); var yAxis = chart.EnsureChartComponent<YAxis>(); xAxis.show = true; yAxis.show = true; xAxis.type = Axis.AxisType.Category; yAxis.type = Axis.AxisType.Value; xAxis.splitNumber = 10; xAxis.boundaryGap = true; }
时间: 2025-03-24 12:24:57 浏览: 33
从你的代码来看,这是一个基于 Unity 引擎的脚本文件,用于动态生成并更新一个折线图 (`LineChart`) 的数据和显示效果。以下是对你提供的代码的功能及结构的详细解析:
---
### **功能概述**
该脚本的主要目的是通过 `LineChart` 组件实时绘制一条随时间变化的曲线,并展示物理系统中某一维度的数据(如 X 轴方向的位置)。核心逻辑分为两部分:
1. 初始化图表组件及其属性;
2. 使用协程周期性地清空旧数据、添加新数据,并刷新图表。
---
### **关键点分析**
#### 1. 命名空间导入
```csharp
using Assets.Scripts.Utils;
using System.Collections;
using UnityEngine;
```
- 导入了自定义工具集 `Assets.Scripts.Utils` 和 Unity 内置的相关命名空间。
```csharp
#if INPUT_SYSTEM_ENABLED
using Input = XCharts.Runtime.InputHelper;
#endif
```
- 这段预处理指令表明,在启用了新的输入系统的环境下,会将 `InputHelper` 别名为 `Input`,便于统一管理输入操作。
```csharp
using XCharts.Runtime;
```
- 表明项目依赖了一个第三方插件库 `XCharts` 来实现复杂的可视化图形绘制功能。
---
#### 2. 图表初始化函数 - `Init()`
```csharp
void Init()
{
chart = gameObject.GetComponent<LineChart>();
if (chart == null)
{
chart = gameObject.AddComponent<LineChart>();
chart.Init();
}
// 设置标题
chart.EnsureChartComponent<Title>().show = true;
chart.EnsureChartComponent<Title>().text = "物理端X轴";
// 启用提示框
chart.EnsureChartComponent<Tooltip>().show = true;
// 隐藏图例区域
chart.EnsureChartComponent<Legend>().show = false;
var xAxis = chart.EnsureChartComponent<XAxis>();
var yAxis = chart.EnsureChartComponent<YAxis>();
// 显示坐标轴
xAxis.show = true;
yAxis.show = true;
// 定义 X/Y 轴类型
xAxis.type = Axis.AxisType.Category;
yAxis.type = Axis.AxisType.Value;
// 其他细节配置...
}
```
**功能说明:**
- 确保当前 GameObject 上存在 `LineChart` 组件;如果不存在,则创建一个新的实例并调用其初始方法 `.Init()`。
- 对图表的关键元素逐一设置样式,包括标题、工具提示气泡(tooltip)、是否隐藏图例等。
- 分别对 X 轴和 Y 轴进行了详细的定制化调整:
- X 轴设为分类型(Category),意味着每个刻度对应具体的类别标签而非数值范围;
- Y 轴则作为值域类型的数轴呈现连续的变化趋势。
- 最终还设置了分隔标记的数量及其他视觉优化选项。
---
#### 3. 数据更新循环 - `IEnumerator UpdatePos()`
```csharp
private IEnumerator UpdatePos()
{
while (true)
{
// 清除之前的所有数据
chart.RemoveData();
// 添加新的系列到图表上
chart.AddSerie<Line>();
for (int i = 0; i < ModelData.Phy_X.Count; i++)
{
// 更新 X 轴的文本标注
chart.AddXAxisData("x" + i);
// 将最新的模型数据插入至第一序列位置
chart.AddData(0, ModelData.Phy_X[i]);
}
// 清理掉已使用的原始数组内容避免冗余存储
ModelData.Phy_X.Clear();
yield return new WaitForSeconds(1f); // 每秒触发一次更新动作
}
}
```
**工作流程描述:**
- 此处利用协程实现了定时任务调度机制,每隔一秒自动清理之前的绘图记录并将最新采集到的一组样本加入其中形成平滑过渡的效果。
- 循环体内部首先调用了清除命令以便于后续重新渲染整个图像界面而不会残留历史痕迹干扰观感体验质量下降的问题发生概率较低但仍然需要注意及时释放资源防止内存泄漏现象产生影响程序长期稳定
阅读全文
相关推荐










