拼ui 一些业务逻辑x实现

This commit is contained in:
2026-03-19 06:15:09 +08:00
parent f5c6f143c0
commit 49e45ac464
1118 changed files with 246518 additions and 5368 deletions
@@ -0,0 +1,73 @@
# 快速导览
本手册面向通过 **`EasyChartLibraryWindow`** 在 Unity 编辑器里配置图表(`ChartProfile` 资产)的工作流。
- 菜单入口:`EasyChart/Library Editor`
- 手册查看器:`EasyChart/Manual`
---
## 目录
### A. 上手与工作流
- [快速导览](./00_00-Index.md)
- [快速上手:2 分钟做出第一张图](./00_01-QuickStart.md)
- [UIToolKit工作流(推荐)](./00_02-WorkflowAndLibrary.md)
- [UGUI工作流](./00_03-UGUIWorkflow.md)
- [运行时数据注入(UIToolKit](./00_04-RuntimeDataInjectionUIToolKit.md)
- [运行时数据注入(UGUI](./00_05-RuntimeDataInjectionUGUI.md)
### B. 编辑器与面板
- [编辑器工作流与面板说明](./01_01-EditorWorkflow.md)
- [Library 面板(资源树)](./01_02-LibraryPanel.md)
- [JSON Injection 面板](./01_03-JsonInjectionPanel.md)
- [Preview 面板](./02_04-PreviewPanel.md)
- [Inspector 面板](./02_05-InspectorPanel.md)
- [Series 面板](./02_06-SeriesPanel.md)
### C. Series详细配置(用户目的导向)
- [折线图(Line](./03_01-LineChart.md)
- [柱状图(Bar](./03_02-BarChart.md)
- [散点图(Scatter](./03_03-ScatterChart.md)
- [热力图(Heatmap](./03_04-HeatmapChart.md)
- [雷达图(Radar](./03_05-RadarChart.md)
- [饼图(Pie](./03_06-PieChart.md)
- [圆环图(RingChart](./03_07-RingChart.md)
### D. 配置项参考(按字段分类,查字典)
- [常用配方(Common Recipes](./04_08-CommonRecipes.md)
- [FAQ(常见问题与最快排错路线)](./04_09-FAQ.md)
### E. 更新与规划
- [更新计划(Roadmap / Update Plan](./05_01-UpdatePlan.md)
---
## 约定与术语
- **ChartProfile**:图表配置资产(可复用,可在编辑器预览)。
- **Series / Serie**:数据序列(例如折线的一条线、柱状图的一组柱)。
- **SeriesData**:序列中的数据点集合。
- **Axis**:坐标轴配置(`AxisType=Category/Value`)。
- **Category**:类目轴(使用 `labels` 列表)。
- **Value**:数值轴(连续数值范围)。
---
## 推荐文件组织
建议在项目中为图表配置建立一个统一目录:
- `Assets/EasyChart/Library/Custom/`:你自己的 `ChartProfile` 资产
- `Assets/EasyChart/Docs/Manual/`:本手册章节(Markdown
---
## 手册版本
- 本手册将随 EasyChart 的字段与编辑器功能迭代同步更新。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 53aa31f9abd8cc148a6ad3cfc73b7b84
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_00-Index.md
uploadId: 857482
@@ -0,0 +1,93 @@
# 快速上手:2 分钟做出第一张图
本章目标:按 EasyChart 推荐的最快路径跑通“**编辑 → 导出 → 在 UI 中使用**”的闭环。
---
## 打开编辑器窗口
在 Unity 菜单栏选择:
- `EasyChart/Library Editor`
你会看到一个类似“资源库/配置面板/预览区”的窗口(后续章节会解释每个区域)。
---
## 克隆一个 Library(推荐)
如果你想快速开始并保持风格一致,建议:
- 先在窗口顶部工具栏选择一个已有 Library(例如内置 Demo 库)
- 点击工具栏的 **Clone**,克隆出你的个人库(例如 `MyLibrary`
这样你后续所有修改都发生在自己的库里,避免污染原始示例。
---
## 克隆一个 ChartProfile(推荐)
在资源树里找到一个接近你目标效果的图表(`ChartProfile`),右键:
- `Clone`
克隆后,你会得到一个新的 Profile(用于做“同款变体”)。选中它,右侧 Inspector 会显示你可以直接修改的所有配置。
---
## 修改配置并保存
最少改动建议:
- `coordinateSystem`:确保与你要的 Series 匹配(例如 Line/Bar/Scatter 用 `Cartesian2D`
- `series`:确认 `type` 正确,并填充 `seriesData`
- `axes`:最少保证 X/Y 轴类型与数据含义匹配
完成修改后,点击窗口顶部工具栏的保存按钮(如果你的版本有),或等待 Unity 自动保存资产。
---
## 导出 UXML(用于 UI Builder 复用)
推荐做法是把 Profile 导出为可复用的 `.uxml`
- 在资源树里右键你的 Profile
- 选择 `Export to UXML`
导出的 UXML 会进入:
- `Assets/EasyChart/LibraryUxml/`Mirror/Backup 相关操作也会在这个根目录下管理导出物)
---
## 在 QuickStart 场景里用 UIDocument + UI Builder 使用
打开示例场景:
- `Assets/EasyChart/Demo/Scenes/EasyChart_QuickStart.unity`
然后在 Project 中找到:
- `Assets/EasyChart/Demo/UIToolKit/NewUXMLTemplate.uxml`
双击它打开(或在 UI Builder 中打开)。接下来:
- 从 Project 里把你刚导出的图表 `.uxml` 拖入到 `NewUXMLTemplate.uxml` 的层级中
- 保存 UXML
- 确认场景里的 `UIDocument` 引用了你编辑后的 `NewUXMLTemplate.uxml`
运行场景,你会看到图表渲染在 UI Toolkit 页面中。
---
## 备选:导出为 UGUI 预制体并使用
如果你希望用 UGUICanvas/RectTransform)工作流,也可以在 Library Editor 中把选中的 Profile 导出为 UGUI 预制体并直接放进场景 UI(具体入口与细节取决于你当前版本提供的菜单项)。
---
## 下一步你应该看什么
- 你要系统理解 UI Toolkit 推荐工作流:`00-WorkflowAndLibrary.md`
- 你要用 UGUICanvas/RectTransform)把图表用起来:`33-UGUIWorkflow.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 7a3e06221e4a0974ebd24b9f268e3d0c
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_01-QuickStart.md
uploadId: 857482
@@ -0,0 +1,429 @@
# UIToolKit工作流(推荐)
本章目标:先把 EasyChart 推荐的整体实现思路讲清楚(以 UI Toolkit 为主):
1. 在编辑器中用 **`EasyChartLibraryWindow`** 编辑 `ChartProfile`
2.`ChartProfile` **导出为 `.uxml`**,作为你的“图表库”资源
3. 在 UI Toolkit 中用 **UI Builder** / UXML 组合页面,实现快速搭建 UI
本章专注于 **UI Toolkit(推荐)**。如果你需要 UGUICanvas/RectTransform)工作流,请看:
- `33-UGUIWorkflow.md`
## 0. 为什么推荐 UI Toolkit 工作流
核心原因:把“图表配置源(ChartProfile)”和“UI 落地物(UXML)”分层管理。
- `ChartProfile`:负责图表“长什么样/用什么轴/有哪些 Series/数据如何解释”,适合在编辑器中集中维护。
- 导出的 `.uxml`:负责把图表以 UI Toolkit 组件形式落地到页面中,适合复用/组合/版本控制。
你最终得到的是:
- 配置可复用(多个页面引用同一套图表风格)
- 页面可组装(UI Builder 拖拽组合,不需要每次从零搭 UI)
- 团队协作更清晰(Profile 作为“源”,UXML 作为“产物/组件库”)
---
## 1. 为什么要导出 UXML
在项目里,`ChartProfile` 负责描述“图表长什么样、用什么轴、有什么 Series、数据点怎么解释”。
当你导出 `.uxml` 后,你得到的是一个可在 UI Toolkit 中复用的 UI 资源:
- 可以被 UI Builder 直接拖拽使用
- 可以被多个页面复用(同一套图表样式)
- 可以被版本控制与资产管理(你的“图表库”)
---
## 2. 推荐工作流(从配置到页面)
### Step 1:克隆出你的工作库与图表(推荐)
- 在 Unity 菜单栏打开:`EasyChart/Library Editor`
推荐流程:
- **Clone Library**:先克隆一个你自己的 Library(避免直接改内置示例库)
- **Clone ChartProfile**:在你的库里右键某个接近目标效果的 Profile,选择 `Clone` 生成变体
- 在右侧 Inspector 修改:
- `coordinateSystem`
- `series`
- `axes`
> 建议:把你自己的 Profile 统一放在 `Assets/EasyChart/Library/Custom/`(或团队约定目录)。
### Step 2:导出 UXML(生成库资源)
你可以在 Library Editor 里执行导出:
- 对某个 Profile`Export to UXML`
- 对某个文件夹:
- `Export Folder to UXML (Mirror)`
- `Export Folder to UXML (Backup)`
- 全量:
- `Export All UXML (Mirror)`
- `Export All UXML (Backup)`
导出根目录:
- `Assets/EasyChart/LibraryUxml/`
多 Library 时通常结构为:
- `Assets/EasyChart/LibraryUxml/<LibraryName>/...`
其中 `_Backups` 子目录用于存放备份导出(以及一些导出过程附带的 JSON 备份文件):
- `Assets/EasyChart/LibraryUxml/<LibraryName>/_Backups/...`
导出的 UXML 核心结构类似:
- 一个 `<ec:ChartElement profile-name="..." />`
- `profile-name` 对应某个 ChartProfile 的 key(通常是资产文件名)
- 同时会写入图表的 width/height 样式
> 重点:你应该把导出的 `.uxml` 当作“可复用图表组件”,而不是每次手写 UI。
### Mirror vs Backup(你应该怎么选)
- **Mirror**
- 用于“把 Profile 当前状态镜像到 UXML”
- 通常会覆盖同名导出物,并可能清理不再存在的旧文件(保持镜像一致)
- **Backup**
- 用于“按时间/标签做一次备份导出”
- 不建议作为页面直接引用的主路径(更适合作为历史快照/回滚)
### Step 3:在 UI Builder 里组装页面
在 UI Builder 中:
- 打开你的页面 UXML
- 从 Project 里拖入导出的图表 `.uxml`
- 将它与其他 UILabel、Button、ListView 等)组合成完整页面
如果你要最快验证导出链路,可以直接使用示例场景与模板:
- 场景:`Assets/EasyChart/Demo/Scenes/EasyChart_QuickStart.unity`
- 模板:`Assets/EasyChart/Demo/UIToolKit/NewUXMLTemplate.uxml`
把导出的图表 `.uxml` 拖入 `NewUXMLTemplate.uxml`,然后确认场景中的 `UIDocument` 引用了该模板。
#### 在 UI Builder 中的具体操作(建议按这个顺序)
1. 打开 UI Builder(或直接双击你的页面 `.uxml`)。
2. 在 Project 中找到你导出的图表 `.uxml`(通常位于 `Assets/EasyChart/LibraryUxml/<LibraryName>/...`)。
3. 将该 `.uxml` 拖入页面的 Hierarchy(建议放进一个容器 `VisualElement` 内)。
4. 保存页面 UXML。
5. 回到场景,确认 `UIDocument` 引用的是你刚保存的页面 `.uxml`
#### 导出的图表 UXML 内部是什么
导出的 `.uxml` 通常包含一个 `EasyChart.ChartElement`,并带有属性:
- `profile-name`:通常对应 `ChartProfile` 的资产文件名(key
- `profile-guid`:更稳定的资产定位方式
因此:
- 如果你只是修改了 Profile,页面不会自动变化:需要重新导出(Mirror)让 UXML 更新。
- 如果你改了 Profile 的资产文件名,导出的 `profile-name` 也会随之变化(建议保持命名稳定)。
### Step 4:运行时加载/替换数据(按你的业务决定)
`ChartProfile`/UXML 负责“样式与结构”,而数据来源通常来自你的业务逻辑。
- 静态展示:直接在 Profile 的 `seriesData` 中填写
- 动态展示:运行时写入/替换 `seriesData`(并保持 `SeriesData.id` 稳定性)
---
## 3. 图表库的目录建议
建议把“配置源”和“导出物”分开:
- `Assets/EasyChart/Library/Custom/`:你维护的 `ChartProfile`
- `Assets/EasyChart/LibraryUxml/`:导出的 UXML(镜像/备份都会落在这个根目录下)
当你使用多 Library 时,导出物通常会按库名分子目录:
- `Assets/EasyChart/LibraryUxml/<LibraryName>/...`
建议约定:
- **Profile 只在 `Assets/EasyChart/Library/...` 下维护**(作为配置源)
- **页面只引用 Mirror 的导出物**(作为组件库)
- Backup 永远只当“历史快照”
> 这样做的好处是:
> - 配置源可读、可编辑
> - 导出物可复用、可组合、可直接用于 UI Builder
---
## 4. 常见问题与排错
- **UI Builder 里找不到导出的图表 UXML**
- 优先检查 `Assets/EasyChart/LibraryUxml/` 下是否已生成
- 如果你使用了多 Library,检查是否在 `Assets/EasyChart/LibraryUxml/<LibraryName>/`
- Mirror/Backup 的导出物可能位于 `_Backups`,不建议页面引用 `_Backups` 里的文件
- **页面里引用了 UXML 但运行时不显示**
- 确认场景里的 `UIDocument` 引用了你编辑的页面 `.uxml`
- 回到 Library Editor 的 Preview 看该 Profile 是否能正常显示(先排除 Profile 配置问题)
- **修改了 Profile 但页面没变化**
- Profile 是“源”,页面引用的是导出的 UXML
- 修改 Profile 后请重新执行导出(Mirror),再回到页面刷新/保存
- **UI Builder 里看得到组件,但运行时仍然不显示**
- 优先确认:场景里的 `UIDocument` 是否真的引用了该页面(而不是另一个旧页面)
- 再确认:Profile 在 Library Editor 的 Preview 是否能正常显示(先排除配置问题)
---
## 5. 下一步你应该看什么
- 你想快速跑通一张图:`01-QuickStart.md`
- 你要用 UGUICanvas/RectTransform)把图表用起来:`33-UGUIWorkflow.md`
---
## 6. 编辑器工作流与面板速查(Library Editor
本节把原先分散在多个章节中的“编辑器工作流与面板说明”合并到一起,作为你在 `EasyChart/Library Editor` 中操作时的速查。
### 6.1 你在编辑的是什么?(ChartProfile
在 Library Editor 里被选中的图表,本质上是一个 `ChartProfile` 资产。
- 它是可复用配置:同一个 Profile 可以被多个场景/Prefab 引用。
- 它是可预览配置:在编辑器里修改后可以立即看到预览变化。
### 6.2 Library Editor 的核心区域
你可以把窗口理解为四块:
- 左侧:Library(资源树)
- 中部:Preview(预览区)
- 右侧:Inspector(配置)
- 右侧:Series(系列与数据)
此外左侧通常还有 JSON InjectionJSON 注入面板)。
### 6.3 Library 面板(资源树)
功能概览:
- 以树状结构展示图表库目录下的文件夹与 `ChartProfile``.asset`)。
- 选中某个 `ChartProfile` 后,会驱动 Inspector/Series/Preview 的绑定与刷新。
- 支持创建/重命名/删除/拖拽移动与排序。
选择逻辑:
- 选中的是文件夹:右侧 Inspector/Series 清空(无 Profile 可编辑)。
- 选中的是 ChartProfile:右侧面板绑定到该 Profile。
常用操作(标题栏与右键菜单,具体以版本为准):
- FolderNew Folder / New Chart / Export Folder to UXMLMirror/Backup/ Rename / Delete
- ChartProfileExport to UXML / Clone / Rename / Delete
### 6.4 Preview 面板(预览区)
Preview 的作用是把当前选中的 `ChartProfile` 直接渲染出来,方便你在编辑配置时即时验证效果。
常见问题:
- 预览为空:确认是否至少 1 条 `Serie`,且该 serie 的 `seriesData` 不为空。
- 数据有但显示怪:确认坐标系与 SeriesType 匹配,轴范围是否把数据排除在外。
### 6.5 Inspector 面板(配置面板)
Inspector 的定位是以“配置视角”编辑 Profile 的序列化字段(坐标系、轴、网格、交互、图例等),并驱动 Preview 更新。
提示:
- 如果你发现某些字段修改后没效果,先确认页面引用的是你导出的 UXML,而不是直接引用 Profile。
### 6.6 Series 面板(系列与数据)
Series 面板以“图表结构”的方式编辑 `ChartProfile.series`
- 添加/删除/排序系列
- 为每条 serie 选择 `type` 并编辑 `settings`
- 编辑 `seriesData`(数据点)
### 6.7 JSON Injection 面板(JSON 注入)
定位:把当前 Profile 的信息表达为可复制的 JSON,并支持解析 JSON 回写到当前 Profile。
推荐工作流:
1. 从当前 Profile 生成示例 JSON
2. Copy 到外部编辑器做批量修改
3. 粘贴回来并 ApplyToChart
---
## 7. 轴与范围(Axis & Range
### 7.1 AxisTypeCategory vs Value
- Category(类目轴):用 `labels` 定义离散类目(A/B/C 或 周一/周二/周三)。
- Value(数值轴):连续数值范围(0~100,-3~30~1e6)。
#### 7.1.1 什么时候用 Category
- X 轴是“文本标签序列”
- 你希望数据点落在 `labels[i]`
- 典型:柱状图(每类一组柱)、折线图(按类目对齐)
Category 的关键点:
- `labels[0]` 对应类目索引 `0`
- `labels[1]` 对应类目索引 `1`
#### 7.1.2 什么时候用 Value
- X 或 Y 轴是连续数值(例如时间戳、金额、温度)
- 你希望轴可以按数值缩放/平移
Value 的关键点:
- 轴范围通常由自动范围计算得到(如果开启 auto range)
- 你可以只锁定一端(例如固定最小值为 0,最大值自动)
### 7.2 Category 轴:labels 与 LabelPlacement
`labels` 决定类目个数与标签文本。
`LabelPlacement` 影响对齐方式:
- `Tick`:标签对齐刻度点,更适合 Line/Scatter。
- `CellCenter`:标签对齐格子中心,更适合 Bar/Heatmap。
常见现象:
- 柱子落在两个标签之间:优先把 `LabelPlacement` 调成 `CellCenter`
### 7.3 Value 轴:autoRangeMin / autoRangeMax
如果你看到范围“锁死”导致数据不显示,先把范围回退到全自动:
- 打开 `autoRangeMin/autoRangeMax`
确认可见后,再逐步加入业务约束(例如柱状图纵轴从 0 起)。
#### 7.3.1 常见模板:Y 轴从 0 开始
- `axisType = Value`
- 固定 `minValue = 0`
- `autoRangeMax = true`
#### 7.3.2 常见模板:只锁定 Max(例如百分比)
- 固定 `maxValue = 100`
- `autoRangeMin = true`
### 7.4 rounding / unit / labelFormat
- rounding:让范围吸附到更“整”的单位。
- unit:显示单位压缩(个/万/百万)。
- labelFormat:控制数字格式(N0/N2/F1/百分比等)。
#### 7.4.1 单位显示(showUnit / unitText
当数值很大(例如 10,000 以上)时,常见做法是让轴末端显示单位(如“万”“k”“M”)。
#### 7.4.2 快速排错
- 标签对不齐 / 柱子夹在标签中间:优先检查 Category 轴的 `LabelPlacement`
- 轴范围很怪(特别大/特别小):检查是否锁死 min/max;检查 rounding/unit
- 刻度小数太多:优先设置 `labelFormat`
---
## 8. Series 与数据(Serie / SeriesData
### 8.1 Serie(一条序列)
`ChartProfile.series` 中每个元素是一个 `Serie`
- `name`
- `type`
- `visible`
- `settings`
- `labelSettings`
- `seriesData`
补充:`settings` 通常是多态对象(`SerializeReference`)。切换 `type` 时,会尝试保留每种类型上一次的 settings(编辑体验更好)。
### 8.2 SeriesData(一个数据点)
`SeriesData` 常见字段:
- `id`:稳定标识(tooltip/hover/隐藏状态)。
- `x`X 坐标或 Category 索引。
- `value`:主要数值。
- `y`:第二维坐标(散点/热力图等)。
- `z`:第三维(sizeMapping 等)。
- `name`:点名称(Radar/Pie/Ring 等可能用到)。
- `useColor` + `color`:点级颜色覆盖。
如果启用了交互,建议保证 `SeriesData.id` 稳定,避免每次刷新数据都生成一套新的 id。
### 8.3 SerieType 与坐标系的匹配
- Cartesian2DLine/Bar/Scatter/Heatmap
- Polar2DRadar
不建议在同一个 ChartProfile(非 Pie)里混用 Polar 与 Cartesian 系列;如果你真的混用,要特别小心 axes/grid 语义是否一致。
### 8.4 常用数据写法(按类型)
#### 8.4.1 Line
- 常见:Category X + Value Y
- 数据点:`x=类目索引``value=数值`
- 连续:Value X + Value Y
- 数据点:`x=横轴数值``value=纵轴数值`
#### 8.4.2 Bar
- Category X + Value Y
- 每个柱子一个点:`x=类目索引``value=柱高`
- 并列:多条 Bar serie 共享同一套 Category X
- 堆叠:`stacked=true``stackGroup` 相同的系列会堆叠
#### 8.4.3 Scatter
- 常用:X=ValueY=Value
- 数据点推荐显式写 `x/y`
#### 8.4.4 Heatmap
- 三元组:`x=列索引``y=行索引``value=强度`
#### 8.4.5 Radar
- 常见理解:`x=维度索引``value=该维度数值``name=维度名称`
### 8.5 数据常见坑(按现象排查)
- Category 图表 X 轴是 Category,但数据点 x 不是 0/1/2...
- 现象:点/柱子不在标签上
- 处理:确保 `x=类目索引`,或者把 X 改成 Value
- 出现 NaN/Infinity
- 现象:整张图不渲染、范围爆炸
- 处理:在数据源侧过滤异常值
- 看不到图(但 seriesData 不为空)
- 检查:坐标系是否匹配(Cartesian vs Polar
- 检查:AxisType 是否匹配数据含义
- 交互/tooltip 指向错乱
- 检查:`SeriesData.id` 是否稳定(不要每次刷新都随机生成一套新的点)
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 09c273b938da2fb42869b05022661833
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_02-WorkflowAndLibrary.md
uploadId: 857482
@@ -0,0 +1,129 @@
# UGUI工作流
本章目标:用 UGUICanvas/RectTransform)把 EasyChart 图表用起来,并理解两种渲染模式的选择:
- `ScreenSpaceOverlay`:画质最好(不使用 RenderTexture),但通常只在 Game 视图可见
- `WorldSpace`Scene/Game 都可见(使用 RenderTexture),适合 3D 世界空间 UI
---
## 1. 推荐方案:UGUIChartBridge
推荐使用 `UGUIChartBridge` 组件。
它的定位是:
- 仍然使用 **UI Toolkit 的 `ChartElement`** 作为图表渲染核心
- 通过桥接把图表“贴合”到某个 UGUI `RectTransform`
因此它兼顾:
- 图表能力与 UI Toolkit 渲染
- UGUI 场景/Prefab 的搭建与布局习惯
---
## 2. 通用前置条件
无论你选哪种模式,都建议先准备:
- 一个要显示的 `ChartProfile`(建议从 `EasyChart/Library Editor` 克隆后修改得到)
- 一个 `PanelSettings` 资产,并在 `UGUIChartBridge``Panel Settings Asset` 中指定
> 备注:`Panel Settings Asset` 对字体渲染与整体稳定性更友好。
---
## 3. Screen Space Overlay(推荐用于 HUD/面板)
### 适用场景
- HUD、UI 面板、弹窗
- 追求画质与清晰度
### 特点
- 不使用 RenderTexture
- 通常只在 Game 视图可见
### 搭建步骤(概览)
1. 创建 `Canvas`
2. 在 Canvas 下创建一个带 `RectTransform` 的节点(`Image` 或空物体均可)
3. 添加 `UGUIChartBridge`
4. 配置:
- `Profile`
- `Panel Settings Asset`
- `Render Mode = ScreenSpaceOverlay`
- `Sort Order`(用于层级覆盖;仅 Screen Space Overlay 模式生效)
关键点:
- 该模式会把图表渲染在一个运行时创建/复用的 `UIDocument` 里。
- 如果被其他 UI 盖住,优先调大 `Sort Order`
---
## 4. World Space(推荐用于 3D 世界空间面板)
### 适用场景
- 3D 世界里的看板/屏幕/面板
- 希望 Scene 视图也能看到渲染结果
### 特点
- 使用 RenderTexture
- Scene 与 Game 视图通常都可见
- 画质可能略受 RenderTexture 分辨率影响
### 搭建步骤(概览)
1. 创建 `Canvas`
2. 设置 `Render Mode = World Space`
3. 在 Canvas 下创建一个带 `RectTransform` 的节点(建议 `RawImage`
4. 添加 `UGUIChartBridge`
5. 配置:
- `Profile`
- `Panel Settings Asset`
- `Render Mode = WorldSpace`
关键点:
- World Space 模式会创建并维护一个 `RenderTexture`,并通过 `RawImage` 显示。
- 清晰度与 `RenderTexture` 分辨率强相关:分辨率通常来自目标 `RectTransform` 的宽高。
- 如果图表模糊,请优先把目标 `RectTransform` 设大一些(例如 600x400+)。
---
## 5. 选型建议(快速结论)
- 优先选 **ScreenSpaceOverlay**
- 你做的是传统 UIHUD/面板)
- 你最在意清晰度
- 优先选 **WorldSpace**
- 你的图表要出现在 3D 世界里
- 你希望 Scene 视图也能看到
---
## 6. 常见问题与排错
- **运行时不显示**
- 确认目标物体的 `RectTransform` 尺寸不是 0
- 确认 `Profile` 已赋值,且该 Profile 在 Library Editor 的 Preview 中能正常显示
- 如果字体显示异常,优先检查 `Panel Settings Asset` 是否为空
- **World Space 模式图表模糊**
- 提升目标 `RectTransform` 尺寸(会提高 RenderTexture 分辨率)
- 避免运行时频繁剧烈缩放(会触发 RenderTexture 调整)
---
## 7. 备选:导出 UGUI Prefab
如果你的版本提供 `Export UGUI Prefab`
- 你也可以将 Profile 导出为 UGUI 预制体并直接在 Canvas 下使用
- 但对交互/兼容性的覆盖范围取决于导出器版本
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 717828663095c664db6b23f3ab9cf0c2
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_03-UGUIWorkflow.md
uploadId: 857482
@@ -0,0 +1,182 @@
# 运行时数据注入(UIToolKit
本章介绍:在 UI Toolkit 工作流下,如何在运行时给 `ChartElement` 注入数据。
对应脚本:`EasyChartDataSource`
---
## 1. 这套方案适合什么场景?
- 你的图表是 UI Toolkit 体系(`UIDocument` + UXML + `ChartElement`
- 你希望提供一套“业务侧更容易调用”的注入 APIlabels / values / x-y / pie / ring
- 或者你希望直接拿一段 JSON 注入(`ChartFeed`
---
## 2. 快速上手(最推荐的流程)
1. 在场景里准备 `UIDocument`,并确保 UXML 里有 `ChartElement`
2. 在挂着 `UIDocument` 的 GameObject 上添加组件:`EasyChartDataSource`
3. 在 Inspector 里填写:
- `uiDocument`
- `chartElementName`(默认 `main-chart`,对应 UXML 中 `ChartElement``name`
- `profile`(可选,但强烈建议填:让样式/Series 类型来自你在编辑器配置好的 `ChartProfile`
4. 在运行时用代码调用:
- `SetCategoryLabels(...)`
- `SetSeriesValues(...)` / `SetSeriesXY(...)`
-`ApplyJson(...)`
组件内部会:
-`UIDocument.rootVisualElement` 里找到目标 `ChartElement`
- 必要时用 `profile` 初始化图表 Data
- 修改 `ChartElement.Data` 并调用 `RefreshData()`
---
## 3. Inspector 字段说明
`EasyChartDataSource` 的核心配置字段:
- `uiDocument`
- 指向当前 UI 的 `UIDocument`
- 如果不填,脚本会尝试 `GetComponent<UIDocument>()`
- `chartElementName`
- 目标 `ChartElement``name`UXML/USS 的那个 name)。默认值为 `main-chart`
- 如果你希望用 JSON 中的 `chartId/chartName` 自动定位,也可以让 `ChartElement``name` 与之保持一致(见第 5 节)。
- `profile`
- 可选。
- 如果赋值,组件会将 `ChartElement.Profile = profile`,用于初始化/保持样式、Series 结构等。
- `playAnimationOnRefresh`
- 每次注入后调用 `RefreshData(..., playAnimation: playAnimationOnRefresh)`
- `allowCreateSeriesFromFeed`
- 当你用 JSON`ApplyJson`)注入时,如果 feed 中的 series 无法匹配到现有 Serie
- `false`(默认):不创建新 Serie,只更新匹配到的部分。
- `true`:允许根据 feed 创建新的 Serie(可能触发重建 renderers)。
---
## 4. 常用注入 API(不写 JSON
### 4.1 设置类目轴标签
`SetCategoryLabels(labels, axisId = AxisId.XBottom)`
- 会把该轴设为 Category,并覆盖 `labels`
### 4.2 单序列 y 值(自动 x=0..n-1
`SetSeriesValues("Sales", values)`
- 默认会找到/创建一条 Serie(默认类型为 Line,不强制改类型)。
- 写入 `SeriesData.value`,并把 `SeriesData.x` 设为索引。
### 4.3 XY 点
`SetSeriesXY("Scatter", x, y)`
-`x[]` 写入 `SeriesData.x`,把 `y[]` 写入 `SeriesData.value`
### 4.4 Pie / Ring 注入
- `SetPie(serieName, names, values)`
- 强制该 Serie 为 `Pie` 类型。
- 使用 `SeriesData.name` 作为切片名,`SeriesData.value` 为数值。
- `SetRing(serieName, names, percents)`
- 强制该 Serie 为 `RingChart` 类型。
- 使用 `SeriesData.name` 作为环名,`SeriesData.value` 为进度值。
---
## 5. JSON 注入(ChartFeed
你可以用:`ApplyJson(json)`
该方法会把 JSON 解析为 `ChartFeed` 并应用到 `ChartElement.Data`
### 5.1 `ChartFeed` 结构
```json
{
"chartId": "optional",
"chartName": "optional",
"axes": [
{
"axisId": "XBottom",
"labels": ["Mon", "Tue", "Wed"]
}
],
"series": [
{
"serieId": "optional",
"name": "optional",
"type": "Line",
"datas": [
{ "x": 0, "value": 12 },
{ "x": 1, "value": 18 }
]
}
]
}
```
对应字段见运行时代码 `Scripts/Runtime/Feed/ChartFeed.cs`
### 5.2 ChartElement 的定位规则(`chartId` / `chartName`
`ApplyJson` 内部会尝试:
- 如果 feed 提供了 `chartId`:优先 `rootVisualElement.Q<ChartElement>(chartId)`
- 其次如果提供了 `chartName`:尝试 `Q<ChartElement>(chartName)`
- 都找不到才退回到 `chartElementName`(默认 `main-chart`
因此:
- 如果你只有一个图表,保持默认值也没问题。
- 如果你一个 UI 里有多个 `ChartElement`,建议让每个图表的 `name` 与 feed 的 `chartId``chartName` 对齐。
### 5.3 series 匹配与类型覆盖
`ApplyJson` 会先检查 JSON 内是否出现过 `"type":`,若出现则认为你希望允许类型覆盖(`allowTypeOverride=true`)。
Serie 匹配规则:
- 如果 `serieId` 非空:按 `Serie.id` 匹配
- 否则如果 `name` 非空:按 `Serie.name` 匹配
- 否则(索引模式):按 feed 的序号匹配(第 i 条对第 i 条)
当无法匹配到 Serie 时:
- `allowCreateSeriesFromFeed=false`(默认):该条 feed 会被跳过(不创建)。
- `allowCreateSeriesFromFeed=true`:会创建新的 Serie,并使用 feed 的 `type/name/serieId`
对已匹配到的 Serie
- 仅当 `allowTypeOverride=true` 且不是索引模式时,才会允许覆盖 `id/name/type`
---
## 6. 常见问题与排错
- **不显示 / TryGetChart 失败**
- 确认 `uiDocument` 赋值正确
- 确认 UXML 中 `ChartElement``name``chartElementName` 一致
- **JSON 解析失败**
- `EasyChartDataSource` 解析 JSON 时:
- 会优先尝试 Newtonsoft(若项目里存在 `Newtonsoft.Json`
- 否则使用 Unity `JsonUtility`,并把 `type/axisId` 的字符串写法转换为枚举整数再解析
- 建议先用一份已知能解析的 JSON(例如从编辑器 JSON 面板生成)再改。
- **注入后 Series 对不上 / 更新错了线**
- 优先使用 `serieId` 做稳定匹配。
- 如果只用 `name`,且同名 Serie 存在多个,脚本会使用第一个并给 warning。
- **JSON 想新增 Serie 但没新增**
-`allowCreateSeriesFromFeed` 打开。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 6f3c0195d0b34d6a9c18cf8c8b45f91d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_04-RuntimeDataInjectionUIToolKit.md
uploadId: 857482
@@ -0,0 +1,155 @@
# 运行时数据注入(UGUI
对应脚本:`UGUIRuntimeJsonInjection``UGUIRuntimeJsonInjectionEditor`
本章介绍:在 UGUI 工作流(`UGUIChartBridge`)下,如何通过 JSON 在运行时把数据注入到图表中。
---
## 1. 这套方案适合什么场景?
- 你有一份来自服务器/业务层的 JSON(或你希望在运行时快速手工编辑 JSON)
- 你希望像编辑器里 `JSON Injection` 面板一样,直接“生成示例 → 修改 → 应用”
- 你已经通过 `ChartProfile` 把样式、轴、Series 类型等结构配置好了
这套注入逻辑的定位是:**更新数据为主**,结构变更(比如新增 Series、强行覆盖 Series 类型)不是它的主要目标。
---
## 2. 快速上手(最推荐的流程)
1. 在场景中搭好 `UGUIChartBridge`(并确保 `Profile` 已赋值)。
2. 在同一个 GameObject 上添加组件:`UGUIRuntimeJsonInjection`
3. 点击 **Generate Example JSON** 生成一份与你当前 Profile 匹配的示例 JSON。
4.`JSON Content` 文本框里修改数据。
5. 点击 **Apply JSON to Chart**
你会看到组件内部:
- 解析 JSON → 转成 `ChartFeed`
-`ChartFeed` 应用到 `UGUIChartBridge.Profile`
- 调用 `_bridge.Refresh()` 刷新图表
---
## 3. 组件与 Inspector 字段说明
`UGUIRuntimeJsonInjection` 必须和 `UGUIChartBridge` 在同一个物体上(脚本有 `[RequireComponent(typeof(UGUIChartBridge))]`)。
### 3.1 JSON Generation Settings
- **Example Mode`ChartJsonExampleMode`**
- 控制“生成示例 JSON”时的格式。
- 一般建议先用 `Standard``Standard_Axis`(更直观)。
- **Data Mode`ChartJsonDatasMode`**
- 控制 `datas` 的数据表达方式。
- `Standard``datas` 为对象数组(例如 `{ "x": 0, "value": 12 }`)。
- `Values``datas` 为纯数值数组(更短)。
- 备注:该格式需要走 `ChartJsonUtils` 的“灵活解析器”(基于 Newtonsoft 的反射解析)。如果你的项目里没有 Newtonsoft(`Newtonsoft.Json` / `Unity.Newtonsoft.Json`),可能会解析失败。
- 因此 **推荐默认使用 `Standard`**,除非你确认项目已引入 Newtonsoft。
- **API Envelope`UseApiEnvelope`**
- 生成示例 JSON 时,是否包一层接口返回壳:
- `{ "code": 200, "message": "success", "data": { ...真正的ChartFeed... } }`
- 应用时也会尝试自动从壳里提取 `data`
- **Auto Generate`AutoGenerateJson`**
- 当你切换 `Example Mode / Data Mode / API Envelope` 时,自动重新生成示例 JSON。
### 3.2 JSON Content
- **JSON Content`JsonContent`**
- 你要注入的 JSON 字符串。
- 如果为空,点击 Apply 时会直接警告并返回。
---
## 4. JSON 格式(ChartFeed
底层的数据模型是 `ChartFeed`
```json
{
"chartId": "optional",
"chartName": "optional",
"axes": [
{
"axisId": "XBottom",
"labels": ["Mon", "Tue", "Wed"]
}
],
"series": [
{
"serieId": "optional",
"name": "optional",
"type": "Line",
"datas": [
{ "x": 0, "value": 12 },
{ "x": 1, "value": 18 }
]
}
]
}
```
字段对应代码:
- `chartId` / `chartName`
-`UGUIRuntimeJsonInjection` 的注入路径里 **不会覆盖** Profile 的 `chartId/chartName`(它调用 `ChartJsonUtils.ApplyFeedToProfile(profile, feed)`,内部 `allowMetaOverwrite=false`)。
- 但这两个字段可以用来帮助别的注入器(例如 `EasyChartDataSource`)在 UI 树里“按名字/ID 寻找 ChartElement”。
- `axes[]`
- `axisId``AxisId` 枚举(如 `XBottom``XTop``YLeft``YRight` 等)。
- `labels` 存在时会把该轴视为 Category,并直接覆盖 labels。
- `series[]`
- **匹配优先级**
- 如果给了 `serieId`:按 `Serie.id` 精确匹配
- 否则如果给了 `name`:按 `Serie.name` 匹配
- 否则(`serieId``name` 都为空):按索引匹配(第 0 个 feed 对应 Profile 第 0 个 serie
- `type`
- 主要用于生成示例 JSON。
- 在当前注入路径中:
- 对已存在且能匹配到的 Serie:**不会强制改类型**(因为这里不允许覆盖 meta)。
- 对“索引模式 + 超出 Profile 数量”而新建出来的 Serie:会使用 feed 里的 `type` 作为新 Serie 的类型。
- `datas[]` 对应每个点:
- `x/y/z/value` 数值
- `id/name`(可选)
- `useColor/color`(可选)
---
## 5. 应用时发生了什么?(注入流程)
点击 **Apply JSON to Chart** 时:
1. 若 JSON 是 API 壳(含 `data` 字段),会先尝试把 `data` 里的对象抽出来。
2. 调用 `ChartJsonUtils.TryDeserializeFeed(json, out feed)` 反序列化为 `ChartFeed`
- 会优先尝试 Newtonsoft(如果项目里有),否则回退到 Unity `JsonUtility`
- `type: "Line"` / `axisId: "XBottom"` 这类字符串,也会在回退路径中被规范化为枚举值再解析。
3. 调用 `ChartJsonUtils.ApplyFeedToProfile(_bridge.Profile, feed)` 把 feed 写回 Profile。
4. 调用 `_bridge.Refresh()` 触发重绘。
---
## 6. 常见问题与排错
- **点击 Apply 没反应 / 控制台有 warningNo UGUIChartBridge or ChartProfile found**
- 确认对象上有 `UGUIChartBridge`
- 确认 `UGUIChartBridge.Profile` 已赋值
- **报错:Failed to parse JSON**
- 先用 Generate 生成一份能解析的 JSON,再在它的基础上改。
- 如果你的接口返回有外层包裹,优先勾选 `API Envelope`,或确保 JSON 的 `data` 字段内才是 `ChartFeed`
- **JSON 生效了但数据没变 / 只变了一部分**
- 检查 `series` 的匹配方式(`serieId` / `name` / 索引模式)。
- 如果你使用的是 `serieId/name` 匹配:确保 Profile 里确实存在对应的 Serie(该注入路径在这种模式下不会自动创建新 Serie)。
- 如果你使用的是“索引模式”(`serieId``name` 都为空):
- 当 feed 的 `series[]` 数量 **超过** Profile 的 Series 数量时,会自动补创建新的 Serie。
- 如果你不希望自动创建,请给每条 serie 明确填 `name``serieId`
- **在编辑器 PlayMode 注入后,Profile 资产被改脏了**
- 注入的本质是“把 feed 应用到 `ChartProfile` 上”。如果你把资产直接拖到桥接上,运行时改动可能会让该资产处于 dirty 状态。
- 如果你不希望影响资产,建议在运行时对 Profile 做一份实例化拷贝再注入。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 9cfd9f2b2e0d4dc5b3d38d1a4c4ad7a7
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/00_05-RuntimeDataInjectionUGUI.md
uploadId: 857482
@@ -0,0 +1,168 @@
# 编辑器工作流与面板说明
本章目标:让你清楚在 `EasyChart/Library Editor` 里“**哪里改什么**”,以及常见编辑流程(创建、克隆、预览、导出)。
---
## 1. 你在编辑的是什么?(ChartProfile
在 Library Editor 里被选中的图表,本质上是一个 `ChartProfile` 资产。
- 它是 **可复用配置**:同一个 Profile 可以被多个场景/Prefab 引用。
- 它是 **可预览配置**:在编辑器里修改后可以立即看到预览变化。
建议:将你自己的 Profile 放到 `Assets/EasyChart/Library/Custom/`(或你团队约定目录)。
---
## 2. Library Editor 的三个核心区域
虽然 UI 细节可能随版本略有变化,但整体可以按下面理解:
### 2.1 左侧:资源树(Library Tree
这里展示的是图表资产(`ChartProfile`)所在的文件夹结构。
常用操作:
- 在文件夹上右键:
- `New Folder...`:新建子目录
- `New Chart...`:创建新的 `ChartProfile`
- 在图表上右键:
- `Clone`:复制一个新的 Profile(用于做变体)
- `Export to UXML`:导出(若你的工作流需要把配置同步/落盘到 UXML)
- `Ping`:在 Project 面板定位该资产
- `Rename...` / `Delete`
> 建议:用 `Clone` 来做“同款不同配色/不同数据规模”的图表变体,避免从零配置。
### 2.2 右侧:Inspector(配置面板)
这里是你主要编辑的地方。
通常会包含:
- **基础设置**
- `coordinateSystem`
- `padding`(如果有)
- `animationDuration`(如果有)
- **Series 列表**:每个 Serie 代表一条线/一组柱/一个散点序列等
- **Axes(坐标轴)**
- 选择使用哪个 `XAxisId/YAxisId`
- 对应 `AxisConfig` 的显示、label、range、ticks 等
- **Legend / Tooltip / Grid**:若你的版本已暴露这些设置
> 经验:先把 `coordinateSystem`、`Series`、`Axes` 配好,其他属于“锦上添花”。
### 2.3 预览区(Preview
用于检查:
- 是否有数据
- 轴范围是否正确
- 标签是否拥挤/偏移
- Tooltip / Legend 的交互(如果启用)
预览出现异常时优先排查顺序:
1. `coordinateSystem` 是否正确
2. `series` 是否至少有 1 条且有数据点
3. Axis 的 `axisType` 与数据 `x/y` 的含义是否匹配
4. Value 轴是否被手动锁死范围(`autoRangeMin/autoRangeMax`
### 2.4 JSON InjectionJSON 注入面板)
在左侧面板下方有一个 **JSON Injection** 区域,用于:
- 快速生成当前选中 `ChartProfile` 的“注入 JSON 示例”
- 将你粘贴/编辑的 JSON 应用回当前选中 Profile`ApplyToChart`
常用控件:
- **API Envelope**:是否使用 `{ code, message, data }` 外层包裹。
- 打开时:生成 JSON 会包一层;解析时也可以识别并自动取 `data`
- **Feed Mode**:示例 JSON 的“结构层级/字段完整度”(用于兼容不同注入协议)。
- **Datas Format**`datas` 字段内部数据点格式(例如更紧凑的数组,或更易读的对象)。
- **ApplyToChart**:将当前文本框中的 JSON 解析并写回到当前选中的 `ChartProfile`
---
## 3. 推荐的编辑流程(从 0 到可复用)
### Step 1:创建或选择一个 ChartProfile
- 新建:在目标文件夹右键 `New Chart...`
- 已有:在左侧树点击选择
如果你希望使用“先克隆再修改”的方式(更推荐):
- 先在窗口顶部工具栏 **Clone** 一个你自己的 Library
- 然后在你自己的库里右键 Profile -> `Clone` 生成变体
### Step 2:确定坐标系
- `Cartesian2D`Line/Bar/Scatter/Heatmap
- `Polar2D`Radar
> 建议:坐标系先定下来,再选 SeriesType,避免后续切换带来风格/轴设置混淆。
### Step 3:配置 Series
- 添加 Series
- 设置 `type`
- 填充 `seriesData`
建议:先用少量数据点(3~8 个)把效果跑通,再扩展数据量。
### Step 4:配置 Axes
最常见组合:
- XCategory
- `labels` 填文本
- YValue
- 开启自动范围(默认)
当你希望更专业的轴显示:
- 使用 `labelFormat`(例如 `F1``N0` 等)
- 使用 `autoRangeMin/autoRangeMax` 只锁定一端范围
- 如果是 Value 轴需要单位:
- `showUnit=true`
- `unitText="个"/"万"`
- `unitLabelStyle` 调字体/颜色/位置
### Step 5:克隆出变体(推荐)
当你需要同款图表做多个版本(配色、字号、轴显示略不同):
- 右键图表 -> `Clone`
- 修改差异项
这样可以保证风格一致,也更便于版本管理。
当你想把图表用于 UI
- UI Toolkit:导出为 UXML,然后在 UI Builder 中组装页面(可参考示例场景 `Assets/EasyChart/Demo/Scenes/EasyChart_QuickStart.unity` 与模板 `Assets/EasyChart/Demo/UIToolKit/NewUXMLTemplate.uxml`
- UGUI:可导出为 UGUI Prefab 并在 Canvas/RectTransform 工作流中使用
---
## 4. 常见坑(快速定位)
- **看不到任何东西**
- `seriesData` 是否为空
- `AxisType` 是否和数据含义匹配(Category 轴配了 labels 吗)
- **Value 轴显示很怪(范围太大/太小)**
- 检查 `autoRangeMin/autoRangeMax`
- 检查 rounding/unit 是否把范围吸附到不合适的单位上
- **柱状图与标签不对齐**
- 关注 `LabelPlacement`Tick vs CellCenter
---
## 下一章
- `00-WorkflowAndLibrary.md`:轴类型、标签放置、自动范围、取整、单位显示等内容已合并到第 7 节
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 92f5070109cc2bb4985fc1864050983f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/01_01-EditorWorkflow.md
uploadId: 857482
@@ -0,0 +1,162 @@
# Library 面板(资源树)
本章说明 `Unity Easy Chart/Library Editor` 窗口左侧的 **Library** 面板:用于管理你的图表资产(`ChartProfile`)与文件夹结构,并决定右侧各面板正在编辑的是哪个 Profile。
---
## 功能概览
- **展示结构**:以树状结构展示“图表库根目录”下的文件夹与 `ChartProfile``.asset`)。
- **选择驱动编辑**:点击某个 `ChartProfile` 后,会驱动:
- Inspector 面板绑定到该 Profile
- Series 面板绑定到该 Profile 的 `series`
- Preview 预览刷新
- JSON Injection 生成示例 JSON(并可 Apply 回写到该 Profile
- **管理资产**:提供创建、重命名、删除、拖拽移动、展开/收起等操作。
---
## 界面结构说明
Library 面板的顶部标题栏从左到右通常包含:
- **Library**:标题。
- **(当前库名称)**:括号内显示当前选中的库/根目录名称(用于区分你可能配置的多个库)。
- **Menu(菜单按钮)**:常用操作入口(和右键菜单类似,但更集中)。
- **Help(帮助按钮)**:打开本章节。
窗口顶部全局工具栏(Window Toolbar)中,Library 下拉框右侧包含:
- **+**:新增一个 Library。
- **-**:删除当前 Library。
- **Clone(克隆当前 Library**:把当前 Library 复制为一个新 Library(详见下文)。
标题栏下面是:
- **资源树(TreeView**
- 文件夹
- `ChartProfile` 资产(图表配置文件)
---
## 选择逻辑(非常重要)
- **选中的是文件夹**
- 右侧 Inspector/Series 会清空(因为没有具体 Profile 可以编辑)。
- JSON Injection 会切换为“无选中 Profile”的示例或保持当前示例(具体以实现为准)。
- **选中的是 ChartProfile**
- Inspector/Series 立即绑定到该 Profile 的序列化数据。
- 任何字段变化会触发 Preview 延迟刷新(`delayCall`)。
建议:如果你发现右侧面板没有内容,先确认左侧是否选中了一个 `ChartProfile`
---
## 常用操作(标题栏 Menu
点击标题栏右侧 **Menu**(小菜单图标)会弹出操作菜单,常见项包括:
- **New Chart**:在“目标文件夹”下创建新的 `ChartProfile`
- **New Folder**:在“目标文件夹”下创建新文件夹。
- **Refresh**:重新扫描并重建树(当你在 Project 视图中手动移动/复制文件后很有用)。
- **Expand All**:展开所有文件夹。
- **Collapse All**:收起所有文件夹。
- **Rename / Delete**:对“当前选中项”执行重命名/删除。
- 如果当前选中的是库根目录,通常会被禁用。
- **Export UGUI Prefab**(当选中的是 Profile 时可用):把选中 Profile 导出为 UGUI Prefab(用于运行时展示)。
### 目标文件夹是如何决定的
Menu 中的 **New Chart / New Folder** 会把资源创建在“目标文件夹”下:
- 如果你当前选中的是 **文件夹**:目标就是该文件夹。
- 如果你当前选中的是 **ChartProfile**:目标通常是该 Profile 所在的文件夹。
- 如果没有选中或不明确:目标通常回退到库根目录。
---
## Clone Library(克隆当前 Library
当你需要把一整套图表库(包含 Profile 与 UXML)复制成一个新的库(用于分支/版本/主题变体等)时,可以使用窗口顶部工具栏里的 **Clone**
### 入口与操作
- 点击 Library 下拉框右侧的 **Clone** 图标。
- 输入新库名称并确认。
### 克隆内容
- `Assets/EasyChart/Library/<当前库>` 会被复制到 `Assets/EasyChart/Library/<新库>`
- `Assets/EasyChart/LibraryUxml/<当前库>` 会被复制到 `Assets/EasyChart/LibraryUxml/<新库>`(如果源库存在对应 UXML 目录)。
### 限制与命名规则
- `<Root>` 库不允许克隆。
- 新名称会做基础清理(移除非法文件名字符),空白名称会被忽略。
- 如果目标库已存在(同名文件夹已存在),会提示并取消。
### 克隆后的行为
- 会自动切换当前选中的 Library 为新库。
- 会刷新 Library 下拉列表与左侧资源树,并触发右侧面板/预览的刷新。
---
## 常用操作(右键菜单)
你也可以在树上的条目上 **右键**
### 右键文件夹
- **New Folder...**:在该文件夹下创建子文件夹。
- **New Chart...**:在该文件夹下创建新的 `ChartProfile`
- **Export Folder to UXML (Mirror/Backup)**:导出该文件夹下的内容到 UXML(用于备份/分发/版本化)。
- **Rename...**:重命名文件夹。
- **Delete**:删除文件夹(请谨慎,属于破坏性操作)。
### 右键 ChartProfile
- **Export to UXML**:导出当前 Profile 的 UXML。
- **Clone**:克隆一个新的 Profile(用于快速派生相似图表)。
- **Rename...**:重命名资产(同时会尝试同步更新 `profile.name` / `profile.chartName`)。
- **Ping**:在 Project 视图中定位该资产。
- **Delete**:删除资产。
---
## 拖拽移动与排序
Library 树支持拖拽移动文件夹或 `ChartProfile`
- **拖拽 ChartProfile 到文件夹**:会触发 `AssetDatabase.MoveAsset`,把 `.asset` 移动到目标文件夹。
- **拖拽文件夹到文件夹**:会把整个文件夹移动到目标文件夹下。
注意:
- 如果目标无效(例如拖到自身/子目录),会拒绝(鼠标提示为 Rejected)。
- 移动后会自动刷新树。
---
## 重命名(双击与内联编辑)
在树上 **双击** 条目会进入内联重命名流程(等价于执行 Rename)。
实现上会对名字做基础清理(移除非法文件名字符)。如果你输入空白或与原名相同,会取消重命名。
---
## 常见问题与排错
- **右侧面板为空**
- 先确认左侧是否选中了 `ChartProfile`(而不是文件夹)。
- **改了名字但 chartName 没更新**
- ChartProfile 可能有额外同步逻辑;建议在 Inspector 里确认 `Chart Name` 字段是否一致。
- **拖拽失败**
- 常见原因:拖到了自身、拖到子目录、或目标路径已存在同名资源。
---
## Help
- 点击标题栏最右侧 **Help** 图标可回到本章节。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 1f3a7a0f7bcd4c9bbf0f6e8a3f5c1d2a
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/01_02-LibraryPanel.md
uploadId: 857482
@@ -0,0 +1,138 @@
# JSON Injection 面板
本章说明 `Unity Easy Chart/Library Editor` 窗口左侧底部的 **JSON Injection** 面板。
它的定位是:用一段可读/可复制的 JSON 来表达当前 `ChartProfile` 的配置(或外部导入的配置),并支持 **ApplyToChart** 将 JSON 解析后回写到选中的 Profile。
---
## 面板位置与作用
- **位置**:Library 面板(资源树)下方。
- **主要用途**
- **导出**:把当前选中 `ChartProfile` 转成示例 JSONFeed
- **编辑**:在文本框里手动修改 JSON
- **导入/应用**:点击 **ApplyToChart**,把 JSON 解析并应用到当前选中的 `ChartProfile`
适用场景:
- **调试**:快速定位“某个字段是否生效”。
- **批量修改**:复制 JSON 到外部编辑器(支持多光标/查找替换),再粘贴回来 Apply。
- **与外部系统对接**:例如你的工具链/脚本生成 Feed,再在编辑器里 Apply。
---
## 控件说明(标题栏)
标题栏从左到右一般包含:
- **Min/Max**(按钮文字会变化)
- 用于切换面板高度。
- `Min`:收起为较小高度(更偏“辅助工具”)。
- `Max`:展开为较大高度(更适合长 JSON)。
- **ApplyToChart**(图标按钮)
- 把当前文本框里的 JSON 尝试解析为 Feed,并应用到选中的 `ChartProfile`
- 成功后会:
- 标记资产为 Dirty 并 `SaveAssets()`
- 刷新 Series 列表
- 刷新 Preview
- **Help**(图标按钮)
- 打开本章节。
---
## 控件说明(按钮行)
标题栏下方还有一行按钮(可能会自动换行):
- **API Envelope**(图标开关)
- 控制示例 JSON 是否包裹为“API 返回格式”。
- 你需要把 Feed 直接交给某个 HTTP API/服务时,这个选项会更方便。
- 切换后会重新生成示例,并覆盖文本框(详见“覆盖规则”)。
- **Feed Mode**(下拉框)
- 用于控制“示例 JSON 输出包含哪些层级/字段”。
- 选项来自内部枚举(常见有):
- `Lite`
- `Standard / ID`
- `Standard / Default`
- `Standard / With Axes`
- `Full`
- 一般建议:
- **快速看结构**:用 `Lite`
- **需要稳定引用**:用 `Standard / ID`
- **需要包含轴配置**:用 `Standard / With Axes`
- **需要完整复制/迁移**:用 `Full`
- **Datas Format**(下拉框)
- 控制 `seriesData`(数据点)字段的输出格式。
- 常见选项:
- `Values`:更精简,偏“只关心数值”。
- `Standard`:默认格式,适合一般编辑与 Apply。
- `Full`:更完整(可能包含更多字段/结构),适合迁移/还原。
- **Copy**(图标按钮)
- 复制当前文本框内容到剪贴板。
---
## 文本框与“覆盖规则”(非常重要)
JSON 文本框是可编辑的,但为了避免你手写的内容被自动覆盖,面板内部有一个“脏标记”逻辑:
- **只要你手动改过文本框内容**,就会认为“用户已修改”(dirty)。
- 当处于 dirty 状态时:
- 编辑器不会自动用示例 JSON 覆盖你的内容。
- 但当你切换以下选项时,会**强制覆盖**(同时清除 dirty):
- `API Envelope`
- `Feed Mode`
- `Datas Format`
- 或在切换选中 Profile 时(会重置为该 Profile 的示例)
建议:
- 如果你要做大幅改动:
- 先 Copy 到外部编辑器改
- 改完再粘贴回来 Apply
---
## ApplyToChart 的行为与注意事项
- **ApplyToChart 会修改当前选中的 `ChartProfile` 资产**。
- 如果 JSON 解析失败,会在 Console 输出错误:
- `ApplyToChart failed: invalid JSON or unsupported format.`
- `Full` 模式下会允许覆盖更多“Meta/结构”信息(例如某些标识/配置),因此更强大也更危险。
建议:
- 在 Apply 前确保:
- 左侧已选中正确的 `ChartProfile`
- JSON 格式正确(括号/逗号)
- 你理解当前 Feed Mode 会覆盖哪些内容
---
## 推荐工作流
### 1) 从当前 Profile 导出并微调
- 选中一个 `ChartProfile`
- 选择合适的 `Feed Mode` / `Datas Format`
- Copy 到外部编辑器微调
- 粘贴回来
- ApplyToChart
### 2) 从外部导入配置
- 把外部 JSON 粘贴到文本框
- ApplyToChart
- 去 Inspector / Series 进一步精调
---
## Help
- 点击标题栏最右侧 **Help** 图标可回到本章节。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 4c9b2d1e8f0a4a7d9c3e5b1f6a2d7c8e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/01_03-JsonInjectionPanel.md
uploadId: 857482
@@ -0,0 +1,78 @@
# Preview 面板
本章说明 `Unity Easy Chart/Library Editor` 中间区域顶部的 **Preview** 面板。
Preview 的作用是:把当前选中的 `ChartProfile` 直接渲染出来,让你在编辑配置时能即时看到结果。
---
## Preview 会在什么时候刷新
Preview 刷新是“延迟刷新”(避免你连续拖动/输入时频繁重绘):
- 当你在 **Inspector****Series** 面板修改任何绑定字段时,会触发一次 `ScheduleUpdatePreview()`
- 当你在 **JSON Injection** 面板点击 **ApplyToChart** 后,会触发刷新。
- 当你在左侧 **Library** 树切换到另一个 `ChartProfile` 时,会刷新到新 Profile。
实现上会把刷新放到 `EditorApplication.delayCall`,因此你可能会感觉到“改完后稍后才更新”——这是预期行为。
---
## Preview 显示什么
- Preview 使用一个运行时的图表组件(例如 `ChartElement`)进行绘制。
- Preview 会直接读取当前选中 `ChartProfile` 的数据并渲染。
你可以把 Preview 理解为:
- **你编辑的就是它渲染的**
- **你看到的就是运行时的效果**(大多数情况下)
---
## 常见问题与排错
### 1) 预览为空
优先排查:
- 是否选中了一个 `ChartProfile`
- 是否至少存在一条 `Serie`
- `seriesData` 是否为空(没有数据点)
### 2) 数据有但显示很怪 / 看不到
常见原因:
- **坐标系与 SeriesType 不匹配**:例如 Profile 是 `Polar2D`,但 Series 选择了非 Radar 的类型。
- **轴范围/数据范围不匹配**:例如数值全都落在轴范围之外。
- **分类轴可见数量(VisibleCount)太小**:导致只显示一小段。
### 3) Console 报错 “Preview refresh failed”
当刷新过程中出现异常,会在 Console 输出:
- `[EasyChartLibraryWindow] Preview refresh failed: ...`
这通常意味着:
- 某个配置组合不合法
- 或某个字段值超出预期(例如 null / NaN)
建议处理:
- 先回退最近一次改动
- 再逐步改回去定位哪一个字段触发异常
---
## 提示
- Preview 只负责“呈现结果”,结构性问题通常需要回到 **Inspector/Series/JSON Injection** 去修。
- 如果你在短时间内修改了很多字段,Preview 可能在最后一次改动后才统一刷新(这是为了性能)。
---
## Help
- 点击标题栏最右侧 **Help** 图标可回到本章节。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: b8e1c4d2a6f3490b9c7d1e2f3a4b5c6d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/02_04-PreviewPanel.md
uploadId: 857482
@@ -0,0 +1,201 @@
# Inspector 面板
本章说明 `Unity Easy Chart/Library Editor` 中间区域底部的 **Inspector** 面板。
Inspector 的定位是:以“配置视角”直接编辑当前选中 `ChartProfile` 的序列化字段(坐标系、轴、网格、交互、图例等),并驱动 Preview 实时更新。
---
## 面板结构概览
当你在左侧 Library 树选中一个 `ChartProfile` 后,Inspector 会构建一组折叠面板(Foldout),通常包括:
- **Chart Settings**:图表基础设置(例如背景、名称等)
- **Coordinate System**:坐标系选择与相关项
- **Axis Settings**:轴配置(X/Y 或 Angle/Radius
- **Grid Settings**:网格相关配置
- **Hover Settings**:悬停/提示相关配置
- **Legend Settings**:图例配置
提示:
- 如果你选中的是文件夹而不是 `ChartProfile`,Inspector 会清空(这是正常的)。
---
## Chart Settings(常用)
### Chart Name
Inspector 里有 `Chart Name` 文本框(来自 `ChartProfile.chartName`)。它不只是显示名,还会参与资产重命名流程:
- 当你在该字段输入新名字并 **失去焦点** 或按 **Enter**
- 编辑器会尝试把 `.asset` 文件重命名为该名字
- 同时尽量保持 `profile.name``profile.chartName` 同步
注意:
- 名字会被做文件名清理(非法字符会被移除/替换)。
- 如果重命名失败(例如同名冲突),会弹出 Error,并回退字段。
### Background
`Background` 通常是一个子折叠块,包含背景颜色/透明度等字段(具体以版本为准)。
---
## Coordinate System(坐标系)
这里会显示 `coordinateSystem` 选择项。
坐标系会影响:
- Series 可选的类型/语义(例如 Polar2D 常见是 RadarPie 类属于特殊布局)
- Axis Settings 中显示的是 CartesianX/Y)还是 PolarAngle/Radius)配置
建议:
- 在开始配置前先确定坐标系,避免后续大规模调整。
---
## Axis Settings(轴配置)
### 轴选择(X Axis / Y Axis
在 Cartesian 模式下,顶部会提供 X/Y 轴的选择下拉:
- **X Axis**:例如 `XBottom` / `XTop`
- **Y Axis**:例如 `YLeft` / `YRight`
选择改变时会:
- 确保轴列表里存在对应 AxisId 的元素(必要时自动创建)
- 刷新下面的 Axis 字段 UI
- 触发 Preview 刷新
### 单个 Axis 的常见字段
每个 Axis 配置通常包含:
- `axisType`Category / Value 等
- `visible`:是否显示
- `color` / `width`:轴线样式
#### LabelTexts(分类轴标签)
Inspector 会提供一个 `LabelTexts`(内部字段名 `labels`)用于配置分类标签。
#### Range(范围)
常见有:
- `minValue` / `maxValue`
- `autoRangeMin` / `autoRangeMax`(开关)
- `autoRangeRounding`(自动范围的取整策略)
- `autoRangeUnit`(某些取整策略下会出现)
#### Ticks / VisibleCount
如果轴支持自动刻度:
- `autoTicks` 开启时会显示 `splitCount`
-**Category Axis** 来说,这个字段会显示为 **VisibleCount**(表示可见分类数量)。
#### Category Auto Scroll(分类轴自动滚动)
如果轴支持分类滚动,常见字段包括:
- `categoryAutoScroll`:是否自动滚动(跑马灯效果)。
- `categorySmoothScroll`:是否平滑滚动。
- `categoryScrollInterval`:滚动间隔。
- `categoryScrollStep`:每次滚动步长。
#### Unit(单位显示)
常见字段:
- `showUnit`:是否显示单位。
- `unitText`:单位文本(例如 `ms`/`%`/`MB`)。
- `unitLabelStyle`:单位文本样式。
---
## Polar Axis(极坐标轴)
`coordinateSystem = Polar2D` 时,Axis Settings 会显示 `polarAxes`
- **Angle Axis**angleAxis
- **Radius Axis**radiusAxis
常见字段含义与 Cartesian 类似:
- `labels`:角度/维度标签(Radar 的维度名称通常来自这里)。
- `visible/color/width`:轴线样式。
- `showLabels/fontSize/labelColor/labelPosition/labelOffset`:标签显示控制。
- `autoRangeMin/autoRangeMax/minValue/maxValue`:半径轴范围。
- `autoTicks/splitCount`:刻度数量。
---
## Grid Settings(字段说明,仅 Cartesian2D
Grid Settings 在 Cartesian2D 下可见,核心字段来自 `cartesianGrid`
- **xGridColor / xGridLineWidth**X 方向网格线颜色与线宽。
- **yGridColor / yGridLineWidth**Y 方向网格线颜色与线宽。
如果需要虚线:
- `xGridDashed` / `yGridDashed`:是否虚线。
- `xGridDashLength` / `yGridDashLength`:虚线实线段长度。
- `xGridDashGap` / `yGridDashGap`:虚线间隔。
- `xGridDashOffset` / `yGridDashOffset`:虚线偏移。
---
## Hover Settings(字段说明,仅 Cartesian2D
Hover Settings 在 Cartesian2D 下可见,核心字段来自 `hover`
- **cursorLineColor**:悬停光标线颜色。
- **cursorLineWidth**:线宽。
- **cursorLineDashed**:是否虚线。
- **cursorLineDashLength / cursorLineDashGap / cursorLineDashOffset**:虚线参数。
---
## Legend Settings(字段说明)
Legend Settings 来自 `legendSettings`(某些情况下会被自动隐藏,见下文)。
- **enabled**:是否显示图例。
- **position**:图例位置(Top/Bottom/Left/Right)。
- **fontSize / color**:文字大小与颜色。
- **backgroundColor**:图例背景色。
- **itemSpacing**:图例项间距。
- **offset**:相对边缘的偏移。
- 当 offset 为默认值时,会随着 position 自动给一个常用偏移(例如 Bottom 默认 `y=-30`)。
---
## Legend Settings(可能会自动隐藏)
当图表是“纯 Pie 系列”(只有 Pie/Ring/Pie3D,没有非 Pie 系列)时,Legend Settings 可能会被自动隐藏。
这是为了避免在某些布局下显示无意义或冲突的图例配置。
---
## 编辑建议与排错
- **改动较多时**:建议配合顶部工具栏的 `Save` 保存资产。
- **修改了关键结构**(例如坐标系、轴类型、Series Type):
- 改完观察 Preview 是否正确刷新
- 如出现不一致,尝试切换一下选中 Profile 触发重建
---
## Help
- 点击标题栏最右侧 **Help** 图标可回到本章节。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 9d7c3b2a1e0f4c8baf6d5e4c3b2a1f0e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/02_05-InspectorPanel.md
uploadId: 857482
@@ -0,0 +1,166 @@
# Series 面板(数据与系列)
本章说明 `Unity Easy Chart/Library Editor` 右侧的 **Series** 面板。
Series 面板以“图表结构”的方式编辑 `ChartProfile.series`:你可以添加/删除/排序系列,设置每条 Serie 的类型与参数,并直接编辑 `seriesData`(数据点)。
---
## 面板结构概览
当你选中一个 `ChartProfile` 后,Series 面板会显示:
- 一组 Serie 卡片(每个卡片对应 `series[i]`
- 最底部的 **+ Add Series** 按钮
每个 Serie 卡片通常由三部分组成:
- **Header(标题行)**:折叠按钮 + 标题
- **Body(主体)**Name / Id / Type / Settings / Data
- **Footer(右下角控制)**:↑ ↓ X
---
## Header:折叠/展开
- Header 左侧有一个小按钮:
- `▼` 表示已展开
- `▶` 表示已折叠
- 折叠状态会被记住(按 Profile + index 存储),用于减少长配置的视觉负担。
---
## Name 与 Serie Id
### Name
- `Name` 字段用于显示与编辑该 Serie 的名称。
- 当你修改 Name 时,卡片标题会同步更新,并触发 Preview 刷新。
### Serie Id(只读)
如果该 Serie 支持 `id` 字段,面板会显示:
- **Serie Id**(只读文本框)
- **Copy**(按钮)复制 id 到剪贴板
这个 id 常用于:
- 交互/高亮/外部系统引用某条 serie
- 保持引用稳定(尤其是你会重排/增删 series 时)
---
## Type(系列类型)与兼容性提示
### Type 下拉框
- `Type` 用于选择 SerieTypeLine/Bar/Scatter/Pie/Radar…)。
- 下拉框会基于注册表提供可选类型;如果当前类型不在列表里,会临时插入以保证可见。
### 兼容性警告
当 SeriesType 与 Profile 的 `coordinateSystem` 不兼容时,Series 面板会显示一段警告文字:
- 仍然允许渲染(不会强制阻止)
- 但会提示坐标轴/网格语义可能不一致
典型例子:
- Profile 是 `Polar2D`,但 SeriesType 选择了 Line/Bar(不推荐)
### Pro-only 类型限制
某些类型在 Free 版本不可用(例如 RingChart / HorizontalBar / Heatmap / Pie3D 等)。
- 当你尝试选择这些类型时,如果未安装 Pro:
- 会显示提示文本
- 并自动把下拉框回退到原来的类型(不会修改资产)
---
## Settings(系列参数)
Series 面板会为每条 serie 显示一组 Settings 配置:
- 根折叠块名称会随类型变化(例如 `LineSettings` / `BarSettings` / `PieSettings` …)。
- 某些类型会有更细分的子折叠(例如 Ring 的 layout/valueMapping 等)。
提示:
- 切换 Type 可能会触发“Settings 实例替换”(managedReference 结构变化)。
- 发生替换时会延迟一帧重建 UI,以避免序列化句柄失效。
---
## DataseriesData(数据点)
Series 面板里会直接展示 `seriesData` 数组(Unity 的默认数组编辑器)。
- 默认会强制展开(便于编辑)。
- 当你增删/修改数据点时,会触发 Preview 刷新。
建议:
- 数据点较多时,可以配合 JSON Injection 面板进行批量编辑。
---
## Footer:排序与删除(渲染顺序)
每个 serie 卡片右下角有三个按钮:
- **↑**:把当前 serie 上移一位(`MoveArrayElement(index, index-1)`
- **↓**:把当前 serie 下移一位(`MoveArrayElement(index, index+1)`
- **X**:删除当前 serie`DeleteArrayElementAtIndex(index)`
渲染顺序提示:
- 通常 **后面的 serie 会绘制在更上层**
- 因此你可以用 ↑↓ 来控制遮挡关系(例如点/线盖住柱子)。
---
## + Add Series(新增系列)
点击底部 **+ Add Series**
- 会在 `series` 数组末尾插入一个新元素。
- 注意:如果当前已经存在至少一条 serie,Unity 的 `InsertArrayElementAtIndex(arraySize)`**复制最后一个元素**(包括 type/settings)。
- 如果这是第一条 serie,会根据坐标系设置默认类型:
- Polar2D:默认 Radar
- 其他:默认 Line
新增后通常会:
- 自动填入名称(如 `Serie N`
- 触发 `EnsureRuntimeData()`
- 刷新 Series 列表与 Preview
---
## 推荐工作流
### 1) 从零创建一张基础图
- + Add Series
- Type 选择 Line 或 Bar
- 在 seriesData 里加入几个点
- 去 Inspector 调整轴范围/可见数量
### 2) 调整遮挡关系
- 用 ↑↓ 调整 series 顺序
- 观察 Preview 中的层级变化
### 3) 大量数据/批量修改
- 在 JSON Injection 中切换 `Datas Format`
- Copy 到外部编辑器批量生成/替换数据
- 粘贴回来 ApplyToChart
---
## Help
- 点击标题栏最右侧 **Help** 图标可回到本章节。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 0a1b2c3d4e5f6789a0b1c2d3e4f50617
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/02_06-SeriesPanel.md
uploadId: 857482
@@ -0,0 +1,111 @@
# 折线图(Line
本章目标:把“折线图在 EasyChart 里到底怎么配置、数据怎么解释、哪些字段会影响渲染”的关键点一次讲清楚。
---
## 1. 适用场景
- 趋势变化(时间序列/按类目变化)
- 多条曲线对比(同一套 X 维度)
- 需要平滑/阶梯/直线等线型表达
---
## 2. 最小可用配置(Checklist
1. `ChartProfile.coordinateSystem = Cartesian2D`
2. 轴(Axis Settings
- X:通常用 **Category**(填写 `labels`)或 **Value**(数值横轴)
- Y:通常用 **Value**
3. SeriesSeries 面板)
- 添加 1 条 `Serie`
- `Serie.type = Line`
- `Serie.seriesData` 至少 2 个点(折线需要至少两点才能连线)
---
## 3. Inspector 对应字段(你在面板里看到的是什么)
- **ChartProfile / Coordinate System**
- `coordinateSystem`
- **Axis Settings**(与坐标系相关)
- Cartesian`cartesian.xAxisId / cartesian.yAxisId`
- 轴列表:`axes[]`(每个 Axis 的 `axisType/labels/min/max/autoRange/...`
- **Series**(每条曲线)
- `series[i].type = Line`
- `series[i].settings`:实际类型为 `LineSettings`
- `stroke`:线条(线型/颜色/宽度/纹理等)
- `point`:点样式(开关/大小/纹理等)
- `hover`:悬停强调(开启后才会有“拾取半径/高亮”)
- `area`:面积填充(折线下方填充)
- `series[i].labelSettings`:数据点标签(是否显示、格式、小数位、偏移等)
---
## 4. SeriesData 字段解释(最关键,按运行时代码)
折线图渲染时使用:
- **X 坐标**`SeriesData.x`
- **Y 数值**`SeriesData.value`
- `SeriesData.y` 在折线图中 **不参与渲染**(不要把 y 当作折线的纵值)。
两种常见写法:
### 4.1 Category X + Value Y(最常用)
- X 轴设为 `AxisType.Category`
- `AxisConfig.labels = ["A","B","C",...]`
- 数据点:
- `x = 类目索引`0/1/2...,会按索引映射到 labels
- `value = 数值`
### 4.2 Value X + Value Y(数值横轴)
- X 轴设为 `AxisType.Value`
- 数据点:
- `x = 横轴数值`
- `value = 纵轴数值`
> 额外说明:当你的轴维度是 **X=Value, Y=Category** 时,运行时会认为是“笛卡尔坐标转置”(transposed),会在渲染时交换 X/Y 的解释方式(用于横向布局的场景)。
---
## 5. 常用样式配置(LineSettings
- **线型**`LineSettings.stroke.lineType`
- `Straight`:直线
- `Step`:阶梯线
- `Smooth`:平滑曲线
- **线条粗细/颜色**`LineSettings.stroke.width` / `LineSettings.stroke.color`
- **点标记**`LineSettings.point.show/size/textureFill`
- **面积填充**`LineSettings.area.show` + `LineSettings.area.textureFill`
---
## 6. 常见坑与排错(按现象)
- **线断裂 / 不显示**
- 检查 `SeriesData.value` 是否出现 `NaN/Infinity`
- 折线至少 2 个有效点
- **点不在标签上(Category X**
- 检查 `x` 是否为 0..(labels.Count-1) 的索引
- 检查是否误把 `x` 写成了“类目字符串”(EasyChart 这里是索引,不是字符串)
- **我填了 y,但图不对**
- 折线图纵值用的是 `value`,不是 `y`
---
## 7. 深入参考
- 轴与范围、Series 与数据:`00-WorkflowAndLibrary.md`
- 常用配方:`05-CommonRecipes.md`
- FAQ`06-FAQ.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 15011b15d3871b341b39a8fcb94cf446
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_01-LineChart.md
uploadId: 857482
@@ -0,0 +1,123 @@
# 柱状图(Bar
本章目标:把柱状图在 EasyChart 中的 **数据解释规则(`SeriesData.x/value`**、**并列/堆叠的真实行为**、以及常用样式字段一次讲清楚。
---
## 1. 适用场景
- 类目对比(A/B/C 的值对比)
- 分组对比(同一类目下多条 Bar 并列)
- 堆叠总量(同一类目下多条 Bar 堆叠)
---
## 2. 最小可用配置(Checklist
1. `ChartProfile.coordinateSystem = Cartesian2D`
2.
- X:通常 `AxisType.Category`(填写 `labels`
- Y:通常 `AxisType.Value`(建议从 0 起)
3. Series
- 添加 1 条 `Serie`
- `Serie.type = Bar`
- `Serie.seriesData` 至少 1 个点
---
## 3. Inspector 对应字段
- **Axis Settings**
- `cartesian.xAxisId / cartesian.yAxisId`
- `axes[]`X/Y 对应 AxisConfig
- **Series**
- `series[i].type = Bar`
- `series[i].settings`:实际类型为 `BarSettings`
- `barWidth`
- `stacked` / `stackGroup`
- `barGap` / `categoryGap`
- `cornerRadius` / `cornerSegments`
- `textureFill`(颜色/纹理)
- `border` / `background`
- `hover`(开启后支持拾取/高亮)
---
## 4. SeriesData 字段解释(按运行时代码)
柱状图核心使用:
- **类目/横向位置**`SeriesData.x`
- 运行时会对 `x``RoundToInt`,因此**你应该把它当作“类目索引”来用**。
- **柱高**`SeriesData.value`
- `SeriesData.y` / `SeriesData.z` 对 Bar 图 **不参与渲染**(不要把 y 当柱高)。
---
## 5. 最常见模板:Category X + Value Y
### 5.1 X 轴(Category
- `AxisType = Category`
- `labels = ["A","B","C",...]`
- 推荐 `labelPlacement = CellCenter`(柱子更容易居中对齐)
### 5.2 数据写法
- `x = 类目索引`0/1/2...
- `value = 柱高`
---
## 6. 分组柱(多系列并列)的真实规则
并列柱的关键点是:
- 多条 `Serie`,都 `type=Bar`
- 所有 serie 共享同一套 X 类目(同一套 labels)
- 每条 serie 的每个点使用相同的 `x` 索引落到同一个类目
并列间距相关字段:
- `BarSettings.barGap`:同一类目下,各组柱之间的间隔
- `BarSettings.categoryGap`:类目与类目之间的额外间隔(会影响边缘留白)
---
## 7. 堆叠柱(stacked)的真实规则
堆叠发生在“同一个 stackGroup 的 Bar serie”之间:
- `BarSettings.stacked = true`
- `BarSettings.stackGroup = "Group1"`
运行时堆叠逻辑要点:
- 对同一个 `x`(类目索引)分别累计正值/负值(正负会分开堆)
- 堆叠后的每根柱顶部 = 当前累计底 + `value`
---
## 8. 常见坑与排错
- **柱子夹在两个标签之间 / 对不齐**
- 优先检查 X 轴 `labelPlacement`(建议 `CellCenter`
- 确认 `x` 是否为整数索引(运行时会 Round)
- **柱子从中间起,不从 0 起**
- 检查 Y 轴(Value Axis)的 `autoRangeMin` 是否关闭并锁定 `minValue=0`
- **堆叠结果不对**
- 检查是否所有需要堆叠的 serie 都设置了相同的 `stackGroup`
- 注意:正值和负值会分别堆叠
---
## 9. 深入参考
- 轴与范围、Series 与数据:`00-WorkflowAndLibrary.md`
- 常用配方:`05-CommonRecipes.md`
- FAQ`06-FAQ.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: ae6c4b2734083ee4abeb2af3455ced06
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_02-BarChart.md
uploadId: 857482
@@ -0,0 +1,107 @@
# 散点图(Scatter
本章目标:把散点图在 EasyChart 的“数据字段约定”说清楚,尤其是 `SeriesData.y/value` 的兼容逻辑,以及 `z` 维度如何驱动 `sizeMapping`
---
## 1. 适用场景
- 相关性分析(X/Y 两个数值维度)
- 分布展示(点云)
- 异常点识别(离群点)
---
## 2. 最小可用配置(Checklist
1. `ChartProfile.coordinateSystem = Cartesian2D`
2.
- 常见:X=ValueY=Value
3. Series
- 添加 1 条 `Serie`
- `Serie.type = Scatter`
- `Serie.seriesData` 至少 2 个点
---
## 3. Inspector 对应字段
- `series[i].type = Scatter`
- `series[i].settings`:实际类型为 `ScatterSettings`
- `point`:点样式(显示/大小/纹理)
- `hover`:悬停高亮(enabled/pickRadius/scale 等,具体字段以版本为准)
- `sizeMapping`:点大小映射
---
## 4. SeriesData 字段解释(按运行时代码)
散点图渲染时使用:
- **X 坐标**`SeriesData.x`
- **Y 坐标**:优先使用 `SeriesData.y`
- 兼容逻辑:如果 `y == 0``value != 0`,运行时会把 `value` 当成 y 来用
- **点大小映射维度**`SeriesData.z`(当 `sizeMapping.enabled=true` 时)
因此你有两种常见写法:
### 4.1 推荐写法(显式 X/Y
- `x = X 值`
- `y = Y 值`
### 4.2 兼容写法(旧数据:用 value 当 y)
- `x = X 值`
- `value = Y 值`
- `y = 0`
> 建议:新数据直接写 `y`,这样不会跟“点的其他含义(value)”混在一起。
---
## 5. 标准模板:Value X + Value Y
- X 轴:`AxisType = Value`
- Y 轴:`AxisType = Value`
- 数据:使用 4.1 的写法(x/y)
---
## 6. sizeMapping(点大小映射)的真实规则
`ScatterSettings.sizeMapping.enabled = true` 时:
- 点半径会根据 `SeriesData.z` 映射得到
- 映射范围:`minValue/maxValue``minSize/maxSize`
-`clamp = true`,会把超范围的 t 值夹到 0..1
- `curve` 会对 t 做一次曲线变换(用于非线性映射)
如果你发现 sizeMapping “没效果”,优先检查:
- 是否真的给了 `z` 值(默认 0
- `minValue/maxValue` 是否相等(相等会导致映射退化)
---
## 7. 常见坑与排错
- **点全在一条水平线**
- 你可能只填了 `value`,但又把 `y` 也写成了非 0(兼容逻辑不会触发)
- 建议统一用 `y` 作为纵坐标
- **hover 没反应**
- `ScatterSettings.hover.enabled` 必须开启
- `pickRadius` 太小也会导致很难拾取
- **点太小/太大**
- 调整 `ScatterSettings.point.size`
- 或检查 sizeMapping 的 `minSize/maxSize`
---
## 8. 深入参考
- 轴与范围、Series 与数据:`00-WorkflowAndLibrary.md`
- 常用配方:`05-CommonRecipes.md`
- FAQ`06-FAQ.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 5e521ae021b6df64291e68ec476be87b
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_03-ScatterChart.md
uploadId: 857482
@@ -0,0 +1,134 @@
# 热力图(Heatmap
本章目标:把热力图在 EasyChart 里的“坐标/格子如何映射、`SeriesData` 字段怎么解释、颜色范围怎么算”的规则讲清楚,并标明它是 Pro 功能。
---
## 1. 适用场景
- 二维矩阵数据展示(行/列)
- 密度/强度可视化
---
## 2. 重要说明(Pro 功能)
- `SerieType.Heatmap` 的渲染器由 `EasyChartProBootstrap` 注册。
- 如果没有安装/启用 EasyChartPro:该 serie 会被当作“动态渲染器”尝试创建,但通常不会显示。
---
## 3. 最小可用配置(Checklist
1. `ChartProfile.coordinateSystem = Cartesian2D`
2. 轴(Axis Settings
- 最常用:X=Category(列),Y=Category(行)
- 也支持 X/Y 使用 Value 轴(见第 6 节)
3. Series
- 添加 1 条 `Serie`
- `Serie.type = Heatmap`
- `Serie.seriesData` 至少 1 个点
---
## 4. Inspector 对应字段
- **Series**
- `series[i].type = Heatmap`
- `series[i].settings`:实际类型为 `HeatmapSettings`
- `renderMode`Grid / Gradient / Contour
- `cellGapPx`
- `xSplitCount` / `ySplitCount`(当 X/Y 使用 Value 轴时用于分格)
- `autoRange / minValue / maxValue`
- `lowColor / midColor / highColor`
- `clamp`
- `influenceMode`None / Bleed / Smooth
- `bleed / smooth / gradient / contour` 子配置
---
## 5. SeriesData 字段解释(按运行时代码)
热力图每个数据点对应一个“格子/像素区域”,运行时使用:
- **X 坐标(列)**`SeriesData.x`
- **Y 坐标(行)**`SeriesData.y`
- **强度值**`SeriesData.value`
- **颜色覆盖**:如果 `SeriesData.useColor = true`,则直接用 `SeriesData.color`,跳过 `low/mid/high` 的插值。
> 注意:Heatmap 的 `x/y` 不接受字符串类目;Category 轴场景下仍然用“索引”。
---
## 6. 标准模板:二维 CategoryX/Y+ value 强度(最常用)
### 6.1 X 轴(Category:列)
- `AxisType = Category`
- `labels = ["Col0","Col1",...]`
### 6.2 Y 轴(Category:行)
- `AxisType = Category`
- `labels = ["Row0","Row1",...]`
### 6.3 数据写法
- `x = 列索引`(运行时会对 `x``RoundToInt`
- `y = 行索引`(运行时会对 `y``RoundToInt`
- `value = 强度`
### 6.4 重要细节:Category 轴下“格子数”与 `labelPlacement`
运行时会用 Axis 的 `labelPlacement` 决定“按 labels.Count 分格”还是“按 labels.Count-1 分格”:
- `CategoryLabelPlacement.CellCenter`
- X 方向格子数 = `labels.Count`
- Y 方向格子数 = `labels.Count`
- 其他(非 CellCenter
- X 方向格子数 = `max(1, labels.Count - 1)`
- Y 方向格子数 = `max(1, labels.Count - 1)`
这会直接影响你应该填的 `x/y` 索引范围。
---
## 7. Value 轴热力图(X/Y 为数值轴)
当 X 或 Y 使用 `AxisType.Value` 时:
- 格子数量不再来自 labels,而来自:
- X`HeatmapSettings.xSplitCount`
- Y`HeatmapSettings.ySplitCount`
- `SeriesData.x/y` 会先根据 `_xMin/_xMax``_yMin/_yMax` 归一化,再映射到格子索引。
这适合做“连续值域上的密度/强度分布”。
---
## 8. 常见坑与排错
- **全部一个颜色 / 对比不明显**
- 检查 `HeatmapSettings.autoRange` 是否开启
- 或者手动设定 `minValue/maxValue`
- 也检查是否所有点的 `value` 都几乎一样
- **颜色不按 low/mid/high 来**
- 检查是否某些点启用了 `useColor=true`(会覆盖调色盘插值)
- **格子对不上(索引越界/偏一格)**
- 检查 Category 轴的 `labelPlacement` 是否为 `CellCenter`
- 根据第 6.4 节确定正确的格子数与索引范围
- **格子缝太大/太密**
-`HeatmapSettings.cellGapPx`
---
## 9. 深入参考
- 轴与范围、Series 与数据:`00-WorkflowAndLibrary.md`
- 常用配方:`05-CommonRecipes.md`
- FAQ`06-FAQ.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: a591ce4ec379e7e44a71dfef2e6cf681
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_04-HeatmapChart.md
uploadId: 857482
@@ -0,0 +1,110 @@
# 雷达图(Radar
本章目标:把雷达图在 EasyChart 中“维度标签来源、数值范围如何计算、数据点顺序如何解释”的规则讲清楚,并对应到 Inspector 字段。
---
## 1. 适用场景
- 多维指标对比
- 能力/属性雷达
---
## 2. 最小可用配置(Checklist
1. `ChartProfile.coordinateSystem = Polar2D`
2. Series
- 添加 1 条 `Serie`
- `Serie.type = Radar`
- `Serie.seriesData` 建议至少 3 个点(少于等于 2 个维度运行时不会绘制/无法 hover)
3. PolarAxes(推荐配置)
- `polarAxes.angleAxis.labels`:维度名
- `polarAxes.radiusAxis`:数值范围(可自动/手动)
---
## 3. Inspector 对应字段
- **ChartProfile / Coordinate System**
- `coordinateSystem = Polar2D`
- **PolarAxes(建议用这套来配 Radar 的轴)**
- `polarAxes.angleAxis.labels`:维度标签
- `polarAxes.radiusAxis.autoRangeMin/autoRangeMax/minValue/maxValue/autoRangeRounding/labelFormat/...`
- **Series**
- `series[i].type = Radar`
- `series[i].settings`:实际类型为 `RadarSettings`
- `radar`:布局(startAngleDeg / clockwise / innerRadius / outerRadius / plot / background
- `stroke`:折线样式
- `area`:面积填充
- `point`:点样式(点显示也会影响 hover 拾取半径)
- `series[i].labelSettings`:数据点标签(可显示维度名与数值)
---
## 4. SeriesData 字段解释(按运行时代码)
Radar 的关键点是:**维度顺序由 `seriesData` 列表索引决定**。
- **数值**:使用 `SeriesData.value`
- **维度索引**:使用“点在 `seriesData` 里的位置 i”(0..dimensionCount-1
- `SeriesData.x` 在 Radar 渲染中 **不参与定位**(不要依赖 x 来表达维度)
维度数量(dimensionCount)来源:
1. 优先 `Data.PolarAxes.angleAxis.labels.Count`
2. 如果没配 angleAxis.labels,则使用(优先)某个 Category Axis 的 labels(见第 5 节)
3. 再不行就用 `seriesData.Count`(或多条 serie 取最大 count
---
## 5. 维度标签(Dimension Label)的真实来源顺序
运行时维度名按以下优先级解析:
1. `polarAxes.angleAxis.labels[i]`
2. `axes[]` 里某个 `AxisType.Category``labels[i]`
- 会优先匹配 `Data.XAxisId` 对应的 Category 轴
3. `seriesData[i].name`
4. 都没有时显示 `Dim i`
> 建议:做 Radar 时直接用 `polarAxes.angleAxis.labels` 统一管理维度名;`SeriesData.name` 作为兜底。
---
## 6. 数值范围(Radius Axis)如何计算
Radar 的半径值域使用 `SeriesData.value` 计算:
- 默认会对所有 Radar serie 的 value 做自动范围(auto range
- 如果你配置了 `polarAxes.radiusAxis`
- `autoRangeMin/autoRangeMax` 会决定 min/max 是否自动
- `minValue/maxValue` 在对应 autoRange 关闭时生效
- `autoRangeRounding` 会对自动出来的 min/max 做“整十/整百/自定义单位”的取整
- `labelFormat` 会影响 tooltip/标签的格式化
---
## 7. 常见坑与排错
- **看不到雷达图**
- 检查 `coordinateSystem` 是否为 `Polar2D`
- 维度数必须大于 2labels 或 seriesData 至少 3
- **维度对不上/顺序错乱**
- Radar 不看 `x`,它按 `seriesData` 的列表顺序当维度顺序
- 需要你在 `seriesData` 里按维度顺序放点
- **hover 很难触发**
- Radar 的拾取半径和 `RadarSettings.point.size` 相关
- 如果 `point.show=false`,拾取半径会变成 0(基本不可 hover)
---
## 8. 深入参考
- Series 与数据:`00-WorkflowAndLibrary.md`
- 常用配方:`05-CommonRecipes.md`
- FAQ`06-FAQ.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 102ac6609d44f2f4abd1326b545e5dab
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_05-RadarChart.md
uploadId: 857482
@@ -0,0 +1,174 @@
# 饼图(Pie
本章目标:把饼图在 EasyChart 中“数据字段怎么解释、布局/聚合/图例/交互如何生效、哪些行为有隐藏前提”的规则讲清楚,并对应到 Inspector 字段。
---
## 1. 适用场景
- 展示“占比/构成”
- 强调每个分类在整体中的比例
不适合:
- 类别过多(通常 > 8~12 个会很难读)
- 需要精确对比微小差异(更建议条形图)
---
## 2. 最小可用配置(Checklist
1. `coordinateSystem`Pie 不依赖 Cartesian/Polar 坐标系(按你的 Profile 现有设置即可)
2. 添加 1 条 `Serie`
- `type = Pie`
- `settings = PieSettings`
- `seriesData` 至少 1 个点
3. 确保每个点的 `value > 0`
> 注意:Pie 当前会忽略 `value <= 0` 的点。
---
## 3. 重要限制(按运行时代码)
- **只绘制第一条可见 Pie serie**:当前渲染器会遍历 `Data.Series`,找到第一条 `type=Pie` 且可见的 serie 绘制后就 `break`
- Pie 的切片隐藏状态来自 `ChartInteractionState.HiddenPieSliceIds`,会在图例点击时写入/移除。
---
## 4. SeriesData 字段解释(按运行时代码)
Pie 主要使用:
- `value`:该切片的数值(权重)
- `name`:切片名称(推荐填写)
- `useColor + color`:切片自定义颜色(可选)
- `id`:切片稳定标识(用于隐藏/交互状态,建议保持稳定)
### 4.1 最推荐写法:显式写 name + value
- `SeriesData.name = "苹果"`
- `SeriesData.value = 12`
### 4.2 name 为空时的名称来源
`SeriesData.name` 为空时,Pie 会尝试从 **labels** 获取名称,但有一个前提:
- 如果 `ChartData.CoordinateSystem == None`(通常是纯 Pie/无坐标系图),运行时会 **跳过 labels 兜底**,只使用 `SeriesData.name`
在非 None 坐标系下,名称兜底顺序是:
- 优先使用 `Data.Cartesian.xAxisId` 对应的 Category 轴 labels
- 若找不到,再使用任意一个 Category 轴 labels
- 最后兜底:`Slice {index}`
> 因此:如果你不想依赖轴配置,建议直接填 `SeriesData.name`。
### 4.3 颜色来源
- 若点上 `useColor=true`:使用 `SeriesData.color`
- 否则:使用内置调色板按顺序分配
---
## 5. 常用配置(PieSettings
Pie 的 `settings``PieSettings`,主要包含:
- `layout`:布局(角度/半径/间隙/居中偏移等)
- `hover`:悬停交互(explode
- `aggregation`:聚合(TopN + Others
- `legend`:Pie 专用图例配置(只在“纯 Pie 图表”场景下替代全局 legend)
### 4.1 layoutPieLayoutSettings
常用字段:
- `startAngleDeg`:起始角度(默认 -90 让第一片从“正上方”开始)
- `clockwise`:顺时针/逆时针
- `angleRangeDeg`:角度范围(默认 360,做“半圆饼”可设 180 等)
- `outerRadius`:外半径
- `<= 0`:自动
- `0~1`:按控件大小比例
- `> 1`:像素
- `innerRadius`:内半径(Pie 通常为 0;>0 会变成“中间有洞”的效果,但更推荐用 RingChart 类型做圆环)
- `innerRadiusColor`:内圈填充颜色
- `sliceGapPx`:切片间隙(像素)
- `sliceGapType`:间隙计算方式(Radial/Translate/Uniform
- `cornerRadius`:圆角(像素,受切片厚度限制)
- `plot.padding`:留白(避免切片/外侧标签被裁剪)
- `plot.centerOffset`:中心偏移
### 4.2 hoverPieHoverSettings
- `hover.enabled`:是否启用悬停交互
- `hover.explodeType`
- `Translate`:整体平移
- `Pull`:拉伸(拉出)
- `Color`:变亮
- `Stroke`:描边强调
- `hover.explodeDistance`:平移/拉伸距离(像素)
### 4.3 aggregationPieAggregationSettings
当分类很多时,可以把小项合并为 `Others`
- `aggregation.enabled = true`
- `keepTopN`:保留前 N 个,其余合并
- `sortByValue`:是否按 `value` 值排序后再取 TopN
- `othersName`Others 的名称
- `useOthersColor + othersColor`Others 颜色
> 注意:聚合只在 `keepTopN > 0` 且切片数量超过 N 时生效。
---
## 6. 图例(PieLegendSettings)与“隐藏切片”交互
当图表是“纯 Pie 图表”(只包含 Pie/RingChart/Pie3D 且没有其它类型)时:
- 图例会优先使用 `PieSettings.legend`(或 RingChartSettings/Pie3DSettings 上的 legend),而不是 `ChartData.legend`
- 点击图例条目会切换 `HiddenPieSliceIds`
- 普通切片:`SeriesData.id`(若为空则用索引字符串)
- 聚合的 Others:固定使用 `__ec_pie_others__`
`PieLegendSettings.source` 会影响“图例条目从哪里来”:
- `Slice`:每个切片一条(默认)
- `RingSlice`:为 RingChart/RingSlice 场景提供 label 来源(优先 PolarAxes.angleAxis.labels
- `Series`:每条 serie 一条(不再是切片级)
---
## 7. 标签(SerieLabelSettings
Pie 标签由 `Serie.labelSettings` 控制:
- `show`:是否显示
- `fontSize / color / decimalPlaces`:字体与数值格式
- `showName`:是否在标签里显示切片名称
- `position``Outside/Inside/Center`
- `offset`:偏移
---
## 8. 常见坑(按现象排查)
- **某些切片不显示**
- 检查该点 `value` 是否 `<= 0`
- **切片名称不是我想要的**
- 推荐:直接填写 `SeriesData.name`
- 如果依赖 labels:确保你确实有一个 Category 轴并填写了 `labels`,且顺序与数据点索引一致
- **切片颜色每次不一样/难以控制**
- 对需要固定颜色的切片:给该点设置 `useColor=true` + `color`
- **隐藏/交互状态不稳定**
- 确保每个点的 `SeriesData.id` 稳定(不要每次刷新都重新生成一套新 id)
---
## 9. 下一章
- 圆环图(RingChart):`16-RingChart.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: c3709635244b93349a7a881f066dbc46
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_06-PieChart.md
uploadId: 857482
@@ -0,0 +1,170 @@
# 圆环图(RingChart
本章目标:说明 RingChart 的真实含义(它不是 donut pie),并把它在 EasyChart 中的 `SeriesData` 字段解释、`RingChartSettings` 配置与 Pro/基础差异对齐到运行时代码。
---
## 1. RingChart 是什么?(非常重要)
在 EasyChart 当前实现中:
- `SerieType.RingChart` 渲染的是 **多条“进度环”**(每个数据点一条环)
- 每条环都是 **完整 360° 的底环 + 一段进度弧**
- 它不是“多个 slice 分割圆周”的饼图
如果你想要“占比构成”的圆环饼图(donut pie):
- 目前更接近 `SerieType.Pie` + `layout.innerRadius > 0`
- 但推荐仍按你的设计决定:
- 构成占比:用 Pie
- 多指标进度/完成率:用 RingChart
---
## 2. 重要说明(Pro 功能)
- `SerieType.RingChart` 的渲染器由 `EasyChartProBootstrap` 注册。
- 未安装/启用 Pro 时,该 serie 通常不会显示。
---
## 3. 最小可用配置(Checklist
1. 添加 1 条 `Serie`
- `type = RingChart`
- `settings = RingChartSettings`
- `seriesData` 至少 1 个点
2. 每个点的 `value > 0`
> 注意:RingChart 会忽略 `value <= 0` 的点。
---
## 4. SeriesData 字段解释(按运行时代码)
RingChart 主要使用:
- `value`:环的进度“原始值”
- `name`:环的名称
- `useColor + color`:环颜色(点级颜色覆盖)
- `id`:稳定标识(用于 legend/隐藏状态,建议保持稳定)
### 4.1 Percent 模式(默认):value 同时支持 0~1 和 0~100
`RingChartSettings.valueMapping.mode = Percent`(默认)时:
- `value <= 0`:该环会被过滤
- `0~1`:按比例(0.72 = 72%
- `> 1`:按百分比(72 = 72%,运行时会除以 100
建议:团队统一用一种写法(全 0~1 或全 0~100),避免误用。
### 4.2 Range 模式:把 value 映射到 0..1
`RingChartSettings.valueMapping.mode = Range` 时:
- 会先确定范围 `min/max`
- `autoRange=true`:从所有 ring 的 value 自动求范围
- `autoRange=false`:使用 `minValue/maxValue`
- 再把 `value` 映射为 `(value-min)/(max-min)` 并 clamp 到 0..1
### 4.3 name 为空时的名称来源
`SeriesData.name` 为空时,RingChart 会尝试从 labels 兜底:
-`ChartData.CoordinateSystem == None`:不会使用 labels 兜底,最终会退回到 `Ring {i}`
- 否则优先:`Data.PolarAxes.angleAxis.labels[i]`
- 再否则:Cartesian/任意 Category 轴的 `labels[i]`
- 最终兜底:`Ring {i}`
如果你不想依赖 PolarAxes 配置,建议直接填 `SeriesData.name`
---
## 5. Inspector 对应字段(RingChartSettings
- `series[i].type = RingChart`
- `series[i].settings`:实际类型为 `RingChartSettings`
- `layout`:角度/半径/内外环/留白/中心偏移
- `valueMapping`Percent/Range 映射规则
- `hover`:悬停强调(Translate/Pull/Color/Stroke
- `legend`RingChart 的图例设置(纯 Pie 图表时生效)
- `showBackground/backgroundAlpha/backgroundColor`:背景环
- `cornerRadius`:端头圆角
- `ringGapPx`:环与环间距
### 5.1 layoutRingChartLayoutSettings
常用字段:
- `startAngleDeg`:起始角度
- `clockwise`:顺/逆时针
- `angleRangeDeg`:默认 360;可做“半环进度”
- `outerRadius`:外半径(<=0 自动;0~1 比例;>1 像素)
- `innerRadius`:内半径(0~1 比例或像素)
- `plot.padding`:留白(避免 hover/标签被裁剪)
- `plot.centerOffset`:中心偏移
### 5.2 hoverPieHoverSettings
- `hover.enabled`:是否启用
- `hover.explodeType`
- `Translate`:整条环平移
- `Pull`:拉伸(拉出)
- `Color`:变亮
- `Stroke`:描边强调
- `hover.explodeDistance`:平移/拉伸距离(像素)
### 5.3 背景环与间距
- `showBackground`:是否绘制背景环
- `backgroundAlpha`:背景环透明度(最终会乘到颜色 alpha 上)
- `backgroundColor`:背景环颜色(alpha=0 时会回退用 ring 本身颜色)
- `ringGapPx`:环与环的间距
- `cornerRadius`:端头圆角(受环厚度限制)
---
## 6. 图例与隐藏交互(与 Pie 共用 HiddenPieSliceIds
- RingChart 与 Pie 共用 `ChartInteractionState.HiddenPieSliceIds`
- 每条环的隐藏 key:优先 `SeriesData.id`,否则使用索引字符串。
- 图例条目 label 的来源受 `PieLegendSettings.source` 影响:
- `RingSlice` 会优先从 `polarAxes.angleAxis.labels` 取名称。
---
## 7. 标签(SerieLabelSettings
RingChart 的标签同样使用 `Serie.labelSettings`
- `show`:是否显示
- `showName`:是否显示 name
- `decimalPlaces`:数值小数位(注意:这里显示的是原始 `value`,不是自动乘 100 的百分比文本)
- `position`
- `Outside`:外侧标签 + 引导线
- `Center`:贴在环中间
---
## 6. 常见坑(按现象排查)
- **我以为它是 donut pie,但显示不对**
- 这是多环进度图:每个点是一条“进度环”
- **进度不对(比如填 75 结果几乎满圈)**
- `value>1` 会按百分比除以 100
- 如果你想 75%:用 `0.75``75`
- **某些环不显示**
- 检查 `value <= 0` 是否被过滤
- **交互/隐藏状态不稳定**
- 确保 `SeriesData.id` 稳定
---
## 8. 深入参考
- 饼图(构成占比):`15-PieChart.md`
- Series 数据结构:`00-WorkflowAndLibrary.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 6cc9d36e426feb043b577230c780a7aa
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/03_07-RingChart.md
uploadId: 857482
@@ -0,0 +1,223 @@
# 常用配方(Common Recipes
本章目标:把常用图表的“最低可用配置”整理成可照抄的配方(Series + Axis + 常见坑),用于你快速创建/排错。
---
## 0. 开始之前:最小检查清单
当你遇到“怎么都看不到/显示很怪”时,先按顺序检查:
1. `coordinateSystem` 是否与 SeriesType 匹配(Cartesian2D vs Polar2D
2. `series` 是否至少 1 条,且该 Serie 的 `seriesData.Count > 0`
3. 轴类型是否匹配数据含义:
- Category 轴:`labels` 非空,且数据点的 `x/y` 是索引(0/1/2...
- Value 轴:数据点 `x/y` 是连续数值
4. 是否存在 NaN/Infinity
5. 是否把 Value 轴范围“锁死”了(`autoRangeMin/autoRangeMax` 或固定 min/max),导致数据落在范围外
---
## 1. 折线图(Line):类目 X + 数值 Y
### 目标效果
- X:类目标签(A/B/C/D
- Y:数值
- 折线按类目对齐
### 配方
1. `coordinateSystem = Cartesian2D`
2. X 轴:
- `axisType = Category`
- `labels = [A, B, C, D]`
- `LabelPlacement = Tick`
3. Y 轴:
- `axisType = Value`
- `autoRangeMin/autoRangeMax = true`
4. Series
- `type = Line`
- 数据点:`x=类目索引``y=数值`
数据示例(概念):
```txt
(x=0, y=10)
(x=1, y=20)
(x=2, y=15)
(x=3, y=30)
```
### 常见坑
- **点不落在标签上**:检查 `x` 是否从 0 开始,是否越界(labels.Count
- **线看起来“断了/跳”**:检查是否有 NaN/Infinity
---
## 2. 柱状图(Bar):类目居中 + Y 从 0 起
### 目标效果
- 每个类目一个柱子
- 标签在柱子中心对齐
- Y 轴从 0 起,避免误导
### 配方
1. `coordinateSystem = Cartesian2D`
2. X 轴:
- `axisType = Category`
- `labels` 填类目
- `LabelPlacement = CellCenter`
3. Y 轴:
- `axisType = Value`
- 固定从 0 开始(例如 `minValue=0` + `autoRangeMax=true`,或等价字段组合)
4. Series
- `type = Bar`
- `BarSettings.barWidth` 调整柱宽
数据示例:
```txt
(x=0, y=12)
(x=1, y=18)
(x=2, y=9)
```
### 常见坑
- **柱子夹在两个标签之间**:把 `LabelPlacement` 切到 `CellCenter`
- **柱子太挤/太疏**:调 `barWidth``barGap``categoryGap`
---
## 3. 并列柱(Grouped Bar):多条 Serie 共享同一套类目
### 配方
- 多条 `Serie`,都设置 `type = Bar`
- 每条 Serie 都写同一套 `x=类目索引`
-`Serie.name` 区分组名(图例/tooltip 会用到)
示例(概念):
```txt
Serie A:
(x=0, y=10) (x=1, y=12)
Serie B:
(x=0, y=8) (x=1, y=15)
```
---
## 4. 堆叠柱(Stacked Bar):stacked + stackGroup
### 配方
- 需要堆叠的 Bar 系列:
- `BarSettings.stacked = true`
- `BarSettings.stackGroup = "Group1"`(同组会堆叠)
### 常见坑
- **堆叠后高度看起来不对**:确认所有参与堆叠的系列 `stackGroup` 完全一致
---
## 5. 散点图(Scatter):Value X/Y + hover + sizeMapping
### 目标效果
- X/Y 都是连续数值
- 鼠标移上去点会变大(hover
- 点大小可按某个维度映射(sizeMapping
### 配方
1. `coordinateSystem = Cartesian2D`
2. X/Y 轴都设为 `Value`
3. `type = Scatter`
4. 数据点:至少 `x/value`,可选使用 `z` 作为第三维
5. `ScatterSettings.hover.enabled = true`
### 常见坑
- **点太小看不见**:提高 `PointSettings.size`
- **hover 没反应**:检查 `HoverHighlightSettings.enabled``pickRadius`
---
## 6. 热力图(Heatmap):(x, y, value) 三元组
### 目标效果
- X/Y 是类目轴(二维标签)
- 颜色由 value 决定
### 配方
1. `coordinateSystem = Cartesian2D`
2. X 轴:Category + labels(列标签)
3. Y 轴:Category + labels(行标签)
4. `type = Heatmap`
5. 数据点:
- `x = 列索引`
- `y = 行索引`
- `value = 强度`
示例(概念):
```txt
(x=0, y=0, value=0.2)
(x=1, y=0, value=0.8)
(x=0, y=1, value=0.5)
```
### 常见坑
- **所有格子同一颜色**:检查 `HeatmapSettings.autoRange/minValue/maxValue/clamp`
- **格子太小/太密**:调 `cellSizePx` / `cellGapPx`
---
## 7. 雷达图(Radar):维度索引 x + 数值 value
### 配方
1. `coordinateSystem = Polar2D`
2. `type = Radar`
3. 数据点:
- `x = 维度索引`
- `value = 数值`
- `name = 维度名`(建议填,便于标签/tooltip
示例:
```txt
(x=0, value=72, name="攻击")
(x=1, value=55, name="防御")
(x=2, value=90, name="速度")
```
### 常见坑
- **雷达图标签乱/缺失**:确保维度标签来源一致(不要依赖 Cartesian 的 axis 配置)
- **看不到雷达**:检查 `coordinateSystem` 是否为 Polar2D
---
## 8. 交互/tooltip 稳定性:SeriesData.id
如果你启用了选中、tooltip 或 hover,一般建议:
- 每个数据点的 `SeriesData.id` 保持稳定
> 否则当你每次刷新数据都生成一套新 id,会造成交互状态无法关联。
---
## 下一章
- 如果你希望继续写:可以新增 `06-FAQ.md`(常见问题 + 最快排错路线)。
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 427d97235a62c9844875fd8456b094e8
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/04_08-CommonRecipes.md
uploadId: 857482
@@ -0,0 +1,173 @@
# FAQ(常见问题与最快排错路线)
本章目标:当你遇到“看不到/显示不对/交互怪”等问题时,能用最短路径定位原因。
---
## 0. 最快排错路线(30 秒版)
按顺序检查,通常能解决 80% 的问题:
1. **坐标系是否匹配 SeriesType**
- Cartesian2DLine/Bar/Scatter/Heatmap
- Polar2DRadar
2. **是否真的有数据**
- `series.Count > 0`
- 该 Serie `seriesData.Count > 0`
3. **轴类型是否匹配数据含义**
- Category 轴:`labels` 非空;数据点 `x/y` 使用索引(0/1/2...
- Value 轴:`x/y` 为连续数值
4. **是否存在 NaN / Infinity**
5. **Value 轴范围是否把数据排除在外**
- 检查是否固定了 min/max
- 检查 `autoRangeMin/autoRangeMax` 是否关闭
---
## 1. 我点了预览但什么都没有
### 可能原因
- `seriesData` 为空
- `Serie.visible = false`
- 坐标系与 SerieType 不匹配(例如 Radar 放在 Cartesian2D
- 轴范围不包含数据(常见于 Value 轴被手动锁死)
### 你应该怎么做
1. 在 Inspector 找到 `series` -> 展开某个 Serie
2. 检查:
- `visible` 是否为 true
- `seriesData` 是否有元素
3. 检查坐标系:
- Radar -> `coordinateSystem = Polar2D`
- Line/Bar/Scatter/Heatmap -> `coordinateSystem = Cartesian2D`
4. 如果是 Value 轴:
- 先把范围相关的“固定 min/max”关闭
-`autoRangeMin/autoRangeMax` 都开,确认能显示后再逐步锁定
---
## 2. Category 轴有 labels,但点/柱子不在标签上
### 典型现象
- 柱子落在两个标签中间
- 折线的点对不上 A/B/C
### 快速结论
- Category 轴下,`x`(或 `y`)通常应该是 **类目索引**(0/1/2/...),而不是“随便的数值”。
### 你应该怎么做
- 检查数据点:
- `labels[0]` 对应 `x=0`
- `labels[1]` 对应 `x=1`
- 如果你做的是柱状图:
-`LabelPlacement` 调成 `CellCenter`
---
## 3. Value 轴范围很怪(特别大/特别小)
### 可能原因
- Value 轴被锁死范围(min/max
- 只锁了一端但另一端的数据非常极端
- rounding/unit 把范围吸附到不合适的单位
### 你应该怎么做
1. 先把范围回退到“全自动”,确认能显示
2. 再逐步加入你的业务约束:
- 柱状图常用:`minValue=0` + `autoRangeMax=true`
3. 如果你看到很多奇怪的小数刻度:
- 优先设置 `labelFormat`
---
## 4. 线条断断续续/整体不渲染
### 最常见原因
- 数据中存在 NaN / Infinity
### 你应该怎么做
- 在数据源侧过滤:
- `float.IsNaN(x/y/z)`
- `float.IsInfinity(x/y/z)`
---
## 5. 柱状图和标签就是对不齐
### 快速结论
- 99% 是 `LabelPlacement` 没配对
### 你应该怎么做
- Bar:优先 `LabelPlacement = CellCenter`
- Line/Scatter:优先 `LabelPlacement = Tick`
---
## 6. Heatmap 全部一个颜色 / 看起来没有层次
### 可能原因
- `autoRange=false``minValue/maxValue` 设置不合理
- `clamp=false` + 极端值导致颜色被拉爆
- 数据点 `value` 全部相同(或全是 0
### 你应该怎么做
1. 开启 `autoRange`
2. 检查数据点 `value` 是否有变化
3. 如果你需要固定范围:
- 合理设置 `minValue/maxValue`
---
## 7. Radar 标签缺失/混乱
### 常见原因
- 维度标签来源不统一
### 推荐做法
- 每个 Radar 点:
- `x = 维度索引`
- `value = 数值`
- `name = 维度名`
并确保 Radar 不依赖 Cartesian 的轴配置来取标签。
---
## 8. tooltip/hover/选中“指错点”或状态不稳定
### 常见原因
- 每次刷新数据都产生新的点标识
### 你应该怎么做
- 保证每个点的 `SeriesData.id` 稳定
- 避免每次刷新都清空再 `Guid.NewGuid()` 生成一套全新的点
---
## 9. 我不知道应该看哪一章
- 你在“创建/克隆/预览/导出”的流程阶段:看 `02-EditorWorkflow.md`
- 你在“轴/范围/对齐/单位/格式”:看 `00-WorkflowAndLibrary.md` 的第 7 节
- 你在“某种图的 data 写法/SeriesData.x/y/z”:看 `00-WorkflowAndLibrary.md` 的第 8 节
- 你只想直接照抄模板:看 `05-CommonRecipes.md`
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 181abec87dc03c34c853389a3a182571
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/04_09-FAQ.md
uploadId: 857482
@@ -0,0 +1,172 @@
# 更新计划(Roadmap / Update Plan
本章用于说明 EasyChart 后续整体更新方向与计划项。
- 本文件**不按版本阶段拆分**(后续会在各类型章节中再做细化计划)
- 本文件以“能力分类”组织:你可以把它当作路线图的目录
## Free / Pro 版本划分(发布策略)
### Free(独立包)
- 定位:覆盖 AssetStore 最常见使用场景,做到“可配置 + 可预览 + 可运行时注入数据”的闭环。
- 包含:现有基础 2D 图表类型、运行时注入(`ChartFeed` / `ApplyJson`)、`EasyChartLibraryWindow` 等编辑器工作流。
### Pro(独立包,包含 Free 全量)
- 定位:在 Free 的基础上提供明显的差异化能力与长期扩展路线。
- 包含:Free 全量 + Pro 增量功能(高级效果 / 新图表类型 / 3D / 工具链等)。
### 兼容策略
- Free 遇到 Pro-only 资产/配置:允许直接报错(不做降级兼容)。
### Pro 首批卖点优先级
- A:新增图表类型
- B3D 图表
- C:2D 高级视觉效果(如贴图UV动画、特效类渲染能力)
---
## 附录:版本计划(含时间,暂定)
> 说明:以下为“按月/季度”的暂定节奏,具体日期可在确定团队人力与上架窗口后再收敛。
### 2026 Q11-3 月):稳定化 + Free 完整闭环
- 2026-01Free v1.0.x):
- 修复/收尾:JSON Injection 面板与示例生成/解析的稳定性(按当前 TODO)
- 文档与示例:对齐最新数据结构与面板能力
- 2026-02Free v1.1.0):
- 2D 体验增强(Free 范围):Bar 圆角、hover 效果(如尚未实现则在此版本落地)
- 编辑器体验:LibraryWindow 常用 workflow 小优化(不引入 Pro 依赖)
- 2026-03Free v1.1.x):
- 回归修复 + 性能/GC 优化(大数据量刷新、tooltip/交互稳定性)
### 2026 Q24-6 月):Pro v1.0(新图表类型优先)
每个类型的Series都加一个动画组件集合,可以添加一些类型的动画例如Point的闪烁,TextureFill的UV动画这些,
- 2026-04Pro v1.0.0):
- 完成 Pro 包结构与发布流程固化(Pro 包含 Free 全量)
- 新图表类型(第一批):Gauge / Funnel(二选一或都做,按复杂度控制)
- 2026-05Pro v1.0.x):
- 新图表类型(第二批):BoxPlot / Candlestick(优先实现其中一个)
- Pro-only 报错提示与 Editor 侧可读错误信息完善
- 2026-06Free v1.2.0 + Pro v1.1.0):
- Free:继续补齐 2D 常用能力与稳定性
- Pro:新图表类型扩展(Treemap / Sunburst 预研或首版)
### 2026 H27-12 月):3D 路线与特效能力
- 2026 Q37-9 月)(Pro v2.0 或 v1.2+):
- 3D 图表(第一批):3D Bar / 3D Scatter(优先其中一个可用闭环)
- 3D 渲染管线与交互基础(按最小可用集拆分迭代)
- 2026 Q410-12 月):
- 3D Surface(预研/试验性)
- 2D 高级视觉效果(Pro):贴图 UV 动画(以及后续更复杂特效能力)
- 工具链增强:Theme / 网络直连 / 自动化测试(择一作为质量提升主线)
---
## 1. 图表类型扩展计划(Chart Types
### 1.1 2D 图表(现有体系增强)
- 目标:在不增加过多 `SerieType` 的前提下,用“settings/variant”补齐常用表达。
- 候选方向(示例):
- Line:更多线型/填充/标注能力(如更丰富的标记/阈值线等),贴图UV动画(Pro)
- Bar:更多堆叠模式、百分比堆叠、瀑布等模式化能力,Bar头部圆角(Free),hover效果(Free),贴图UV动画(Pro)
- Scatter:更多映射维度(size/color)、密度表达(如聚合/栅格化)
- Pie:更多布局与聚合策略、标签策略与交互
### 1.2 新增图表类型(可能新增 `SerieType`
- 目标:支持 AssetStore 更常见的“独立图表品类”。
- 候选方向(示例):
- Gauge / 仪表盘(进度、刻度、阈值)
- Funnel / 漏斗图
- BoxPlot / 箱线图
- Candlestick / K 线(OHLC
- Treemap / Sunburst(层级可视化)
- Sankey / Graph(更复杂的结构类图表,后置)
### 1.3 3D 图表(3D Charts
- 目标:提供一套 3D 图表能力(可能是独立渲染管线)。
- 候选方向(示例):
- 3D Bar / 3D Column
- 3D Scatter
- 3D Surface(难度更高,后置)
---
## 2. 多轴与坐标系能力(Multi-Axis & Coordinate Systems
- 目标:在保持语义清晰的前提下,增强多轴场景。
- 方向:
- 支持更多轴组合(双 Y 轴、顶/底 X 轴、左右 Y 轴的混搭)
- 更清晰的轴绑定策略(Serie 绑定到哪个轴、tooltip/label 使用哪个轴格式化)
- 坐标系切换/混用的约束与提示(避免用户配置混乱)
---
## 3. 字体与文本系统(Font & Text
- 目标:统一文本渲染的观感与可配置项,降低 UI Toolkit 不同平台的差异。
- 方向:
- 更完整的文字样式(字体、字号、粗细、颜色、描边/阴影等)
- 文本布局策略(自动换行、截断、省略号、对齐与锚点)
- 数值格式化能力增强(千分位、单位、百分比、科学计数法等)
---
## 4. 时间轴与 Log 轴(Time Axis & Log Axis
- 目标:增强对“时间序列”和“数量级跨度很大”的数据表达能力。
- 方向:
- 时间轴:时间刻度、格式化、间隔策略(天/周/月/年)
- Log 轴:log10/log2 等刻度与标签
- 与数据注入配合(如何喂时间数据、如何处理缺失点)
---
## 5. 主题系统(Theme / Palette
- 目标:把“配色/字体/默认样式”从单个 Profile 抽象成可复用主题。
- 方向:
- Theme 资产(Palette + 字体 + 默认样式)
- Profile 与 Theme 的覆盖策略(主题默认 vs Profile 局部覆盖)
- 主题预览、主题切换、主题库
---
## 6. 网络接口直连(Direct Networking / Data Binding
- 目标:降低“从网络接口到图表”的接入成本。
- 方向:
- 提供基于 `ChartFeed` 的标准输入协议
- 提供可选的 API Envelope 支持(如 `{code,message,data}`
- 提供示例:HTTP 拉取 -> 解析 -> Apply
- 缓存、节流、错误提示与降级策略
---
## 7. 自动化测试与质量保障(Automated Tests & QA
- 目标:降低迭代风险,让重构更安全。
- 方向:
- 数据结构迁移测试(序列化兼容性)
- 渲染回归测试(截图对比/像素容差,或关键顶点/mesh 断言)
- 交互测试(tooltip/hit test 的稳定性)
- 性能基准(大数据量刷新、GC、帧耗时)
---
## 8. 编辑器工作流与工具链(Editor Workflow & Tooling
- 目标:让配置、预览、注入与复用更顺手。
- 方向:
- LibraryWindow:模板/复制/导入导出/批量处理
- JSON Injection:更强的协议兼容、错误定位、示例生成
- 更清晰的手册与示例工程
@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 37acd7887e3b96b4d9355d35f950ed8f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 359794
packageName: Easy Chart Lite
packageVersion: 1.0
assetPath: Assets/EasyChart/Docs/Manual/zh/05_01-UpdatePlan.md
uploadId: 857482