【整合】 框架使用规则
This commit is contained in:
@@ -1,248 +1,104 @@
|
||||
# UI 拼接工具
|
||||
|
||||
## 概述
|
||||
## 目的
|
||||
|
||||
UI 拼接工具提供 JSON 配置与 Unity 预制体的双向转换,帮助 UI 相关人员通过 JSON 配置文件快速生成 UI 预制体,同时支持从现有预制体反向导出 JSON 用于版本控制或重新生成。
|
||||
UI 拼接工具通过 JSON 与 Unity Prefab 双向转换,帮助 Codex 和开发人员创建基础 UI 层级、检查现有 Prefab,并继续在 Unity 中完成业务绑定和视觉校对。
|
||||
|
||||
## 核心组件
|
||||
## 当前实现
|
||||
|
||||
| 组件 | 职责 | 文件路径 |
|
||||
|-----|------|---------|
|
||||
| **UIPrefabGenerator** | 解析 JSON 并生成 UI 预制体 | `Assets/Editor/Command/UIPrefabGenerator.cs` |
|
||||
| **UIPrefabToJson** | 从预制体反向导出 JSON | `Assets/Editor/Command/UIPrefabToJson.cs` |
|
||||
| **RemoteCommand** | 提供外部调用接口 | `Assets/Editor/Command/RemoteCommand.cs` |
|
||||
| **ExternalCommandListener** | 监听外部命令触发文件 | `Assets/Editor/Command/ExternalCommandListener.cs` |
|
||||
| 组件 | 位置 | 职责 |
|
||||
|---|---|---|
|
||||
| `UIPrefabGenerator` | `Assets/Editor/Command/UIPrefabGenerator.cs` | 读取 UI JSON 并生成 Prefab |
|
||||
| `UIPrefabToJson` | `Assets/Editor/Command/UIPrefabToJson.cs` | 导出 Prefab 的层级和组件数据 |
|
||||
| Unity Bridge | `Assets/Editor/Command/CodexUnityEditorBridge.cs` | 在 Unity 主线程执行生成和导出命令 |
|
||||
| MCP Server | `UnityAI/Tools/CodexUnityMcp/` | 把 Unity Bridge 命令暴露给 Codex |
|
||||
|
||||
工具脚本在文档库中的位置(已并入编辑器工具模块):
|
||||
当前外部入口是 MCP Bridge,不使用文件监听或文本触发命令。
|
||||
|
||||
```
|
||||
modules/frameworks/编辑器工具/UI工具/
|
||||
├── ExternalCommandListener.cs # 外部命令监听器
|
||||
├── RemoteCommand.cs # 远程命令接口
|
||||
├── UIPrefabGenerator.cs # JSON 转预制体生成器
|
||||
└── UIPrefabToJson.cs # 预制体转 JSON 导出器
|
||||
```
|
||||
## 数据结构
|
||||
|
||||
## JSON 配置文件结构
|
||||
根节点使用 `UILayoutData`:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "BagWindow",
|
||||
"width": 1024,
|
||||
"height": 768,
|
||||
"elements": [
|
||||
{
|
||||
"type": "Image",
|
||||
"name": "BgPanel",
|
||||
"anchorMin": [0, 0],
|
||||
"anchorMax": [1, 1],
|
||||
"position": [0, 0, 0],
|
||||
"sizeDelta": [0, 0],
|
||||
"sprite": "Assets/Game/GameHFResource/CN/UIWindows/BagWindow/Sprites/Bg.png"
|
||||
},
|
||||
{
|
||||
"type": "Text",
|
||||
"name": "TitleText",
|
||||
"anchorMin": [0.5, 0.9],
|
||||
"anchorMax": [0.5, 0.9],
|
||||
"position": [0, 0, 0],
|
||||
"sizeDelta": [200, 40],
|
||||
"text": "背包",
|
||||
"font": "Assets/Game/GameHFResource/CN/Fonts/FZY4K-M05S SDF.asset",
|
||||
"fontSize": 28,
|
||||
"color": [1, 1, 1, 1]
|
||||
}
|
||||
]
|
||||
"name": "ExampleWindow",
|
||||
"type": "Canvas",
|
||||
"layer": 5,
|
||||
"rectTransform": {
|
||||
"anchorMin": [0.5, 0.5],
|
||||
"anchorMax": [0.5, 0.5],
|
||||
"position": [0, 0, 0],
|
||||
"sizeDelta": [1080, 1920],
|
||||
"pivot": [0.5, 0.5],
|
||||
"localScale": [1, 1, 1],
|
||||
"localRotation": [0, 0, 0]
|
||||
},
|
||||
"children": []
|
||||
}
|
||||
```
|
||||
|
||||
## 支持的 UI 元素类型
|
||||
子节点使用 `UIElementData`,可配置 `rectTransform`、`image`、`button`、`text`、`layoutGroup`、`scrollRect`、`toggle`、`slider`、`inputField`、`customComponents` 和递归 `children`。
|
||||
|
||||
| 类型 | 对应 Unity 组件 | 关键属性 |
|
||||
|-----|-------------|---------|
|
||||
| **Image** | Image | sprite, color, type, preserveAspect |
|
||||
| **TextMeshProUGUI** | TextMeshProUGUI | text, font, fontSize, color, alignment |
|
||||
| **Button** | Button | interactable, transition, navigationMode |
|
||||
| **Slider** | Slider | minValue, maxValue, value, wholeNumbers, direction |
|
||||
| **Toggle** | Toggle | isOn, toggleTransition, transition |
|
||||
| **InputField** | InputField | text, placeholder, characterLimit, contentType |
|
||||
| **ScrollRect** | ScrollRect | horizontal, vertical, movementType |
|
||||
| **GridLayoutGroup** | GridLayoutGroup | cellSize, spacing, constraint, padding |
|
||||
| **VerticalLayoutGroup** | VerticalLayoutGroup | spacing, childAlignment, padding |
|
||||
| **HorizontalLayoutGroup** | HorizontalLayoutGroup | spacing, childAlignment, padding |
|
||||
## 支持组件
|
||||
|
||||
## 外部命令触发机制
|
||||
- `Image` / `SFUI_Image`
|
||||
- `Button` / `SFUI_Button`
|
||||
- `TextMeshProUGUI` / `SFUI_TextMeshProUGUI`
|
||||
- `RectTransform`、`Canvas`、`CanvasScaler`、`GraphicRaycaster`
|
||||
- `ScrollRect` / `SFUI_ScrollRect`
|
||||
- `SFUI_Viewport`、`SFUI_Content`、`SFUI_ListViewItem`
|
||||
- `GridLayoutGroup`、`VerticalLayoutGroup`、`HorizontalLayoutGroup`
|
||||
- `Toggle` / `SFUI_Toggle`
|
||||
- `Slider` / `SFUI_Slider`
|
||||
- `InputField` / `SFUI_InputField`
|
||||
|
||||
### 触发方式
|
||||
资源字段使用 Unity Asset 路径,例如 `Assets/Game/...`,路径分隔符统一使用 `/`。
|
||||
|
||||
通过创建/修改 `Trigger_Command.txt` 文件触发 UI 生成:
|
||||
## MCP 调用
|
||||
|
||||
```
|
||||
GenerateUIPrefab:Assets/Editor/UI/BagWindow.json
|
||||
生成 Prefab:
|
||||
|
||||
```text
|
||||
unity_generate_ui_prefab(jsonPath, prefabPath)
|
||||
```
|
||||
|
||||
### 命令格式
|
||||
导出 Prefab:
|
||||
|
||||
```
|
||||
<命令名>:<参数1>:<参数2>:...
|
||||
```text
|
||||
unity_export_prefab_to_json(prefabPath, jsonPath)
|
||||
```
|
||||
|
||||
**支持的命令**:
|
||||
路径由当前任务明确传入,不规定固定测试目录或中间数据目录。目标正式窗口通常位于:
|
||||
|
||||
| 命令 | 参数 | 说明 |
|
||||
|-----|------|------|
|
||||
| **GenerateUIPrefab** | `jsonPath` [, `prefabPath`] | 根据 JSON 生成 UI 预制体 |
|
||||
| **ExportPrefabToJson** | `prefabPath` [, `jsonPath`] | 从预制体反向导出 JSON |
|
||||
| **ReadJson** | [参数列表] | 读取 JSON 配置(测试用) |
|
||||
|
||||
### 完整执行流程
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 外部系统写入命令到 Trigger_Command.txt │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ ExternalCommandListener (FileSystemWatcher) 检测到文件变化 │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 解析命令格式:GenerateUIPrefab:Assets/Editor/UI/BagWindow.json │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 通过反射调用 RemoteCommand.GenerateUIPrefab(string[] args) │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ UIPrefabGenerator.GeneratePrefabFromJson(jsonPath, prefabPath) │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 生成预制体到指定路径:Assets/Game/GameHFResource/CN/UIWindows/... │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
```text
|
||||
Assets/Game/GameHFResource/<语言>/UIWindows/<WindowName>/<WindowName>.prefab
|
||||
```
|
||||
|
||||
## 使用示例
|
||||
## 标准流程
|
||||
|
||||
### 方式一:外部命令触发
|
||||
1. 先读 [UI 界面拼接](../UI窗口系统/界面拼接.md) 和 [UI 开发指南](../UI窗口系统/开发指南.md)。
|
||||
2. 调用 `unity_health` 确认 Unity 项目和版本。
|
||||
3. 检查目标 Prefab、窗口脚本和可用资源。
|
||||
4. 生成基础 Prefab,或先导出现有 Prefab 再调整 JSON。
|
||||
5. 调用 `unity_refresh_assets`。
|
||||
6. 调用 `unity_get_console_logs` 检查 Error 和关键 Warning。
|
||||
7. 在 Unity 中检查层级、RectTransform、组件、资源引用和实际显示。
|
||||
|
||||
```bash
|
||||
# 正向:从 JSON 生成预制体
|
||||
echo "GenerateUIPrefab:Assets/Editor/UI/BagWindow.json" > "F:\JMNet\CrystalBattle_Client\Trigger_Command.txt"
|
||||
工具生成成功只表示 Prefab 文件已创建,不表示 UI 已完成。业务脚本、列表初始化、字体、图集、点击区域和视觉结果仍需验证。
|
||||
|
||||
# 反向:从预制体导出 JSON
|
||||
echo "ExportPrefabToJson:Assets/Game/GameHFResource/CN/UIWindows/BagWindow/BagWindow.prefab" > "F:\JMNet\CrystalBattle_Client\Trigger_Command.txt"
|
||||
```
|
||||
## 安全规则
|
||||
|
||||
### 方式二:Unity 编辑器菜单
|
||||
|
||||
**正向生成**:
|
||||
1. 打开 Unity 编辑器
|
||||
2. 点击菜单 `Tools > External > Test GenerateUIPrefab`
|
||||
3. 查看 Console 窗口日志确认执行结果
|
||||
|
||||
**反向导出**:
|
||||
1. 打开 Unity 编辑器
|
||||
2. 点击菜单 `Tools > UI > Export Prefab to JSON`
|
||||
3. 选择要导出的预制体文件
|
||||
|
||||
### 方式三:代码调用
|
||||
|
||||
```csharp
|
||||
// 正向:从 JSON 生成预制体
|
||||
UIPrefabGenerator.GeneratePrefabFromJson(
|
||||
"Assets/Editor/UI/BagWindow.json",
|
||||
"Assets/Game/GameHFResource/CN/UIWindows/BagWindow/BagWindow.prefab"
|
||||
);
|
||||
|
||||
// 反向:从预制体导出 JSON
|
||||
UIPrefabToJson.ExportPrefabToJson(
|
||||
"Assets/Game/GameHFResource/CN/UIWindows/BagWindow/BagWindow.prefab",
|
||||
"Assets/Editor/UI/BagWindow.json"
|
||||
);
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **路径格式**:JSON 中的资源路径使用 `/` 分隔符,且为 Unity 项目相对路径
|
||||
2. **资源引用**:确保 JSON 中引用的 Sprite、Font 等资源已存在于项目中
|
||||
3. **编码格式**:JSON 文件使用 UTF-8 编码
|
||||
4. **坐标系统**:使用 Unity RectTransform 的 anchorMin/anchorMax/position/sizeDelta 四元组
|
||||
5. **文件锁定**:生成前确保目标预制体文件未被其他进程占用
|
||||
|
||||
## 部署步骤
|
||||
|
||||
### 方法一:手动复制
|
||||
|
||||
1. 复制 `modules/frameworks/编辑器工具/UI工具/` 目录下的所有文件
|
||||
2. 粘贴到目标项目的 `Assets/Editor/Command/` 目录中
|
||||
3. 确保目录结构如下:
|
||||
```
|
||||
Assets/Editor/Command/
|
||||
├── ExternalCommandListener.cs
|
||||
├── RemoteCommand.cs
|
||||
├── UIPrefabGenerator.cs
|
||||
└── UIPrefabToJson.cs
|
||||
```
|
||||
|
||||
### 方法二:自动部署脚本
|
||||
|
||||
创建部署脚本 `DeployUITools.bat`:
|
||||
|
||||
```batch
|
||||
@echo off
|
||||
set "SOURCE_DIR=E:\AI\UnityAI\modules\frameworks\编辑器工具\UI工具"
|
||||
set "TARGET_DIR=%cd%\Assets\Editor\Command"
|
||||
|
||||
mkdir "%TARGET_DIR%" 2>nul
|
||||
xcopy "%SOURCE_DIR%\*.cs" "%TARGET_DIR%\" /y
|
||||
xcopy "%SOURCE_DIR%\*.cs.meta" "%TARGET_DIR%\" /y
|
||||
|
||||
echo UI 工具部署完成
|
||||
pause
|
||||
```
|
||||
|
||||
### 部署检查项
|
||||
|
||||
| 检查项 | 要求 |
|
||||
|-------|------|
|
||||
| **目标路径** | 必须放置在 `Assets/Editor/Command/` 目录下 |
|
||||
| **文件完整性** | 必须包含所有 4 个 cs 文件及其 meta 文件 |
|
||||
| **Unity 版本** | 支持 Unity 2020 及以上版本 |
|
||||
| **依赖组件** | 需要导入 TextMeshPro 包 |
|
||||
|
||||
### 验证部署
|
||||
|
||||
部署完成后,在 Unity 编辑器中验证:
|
||||
|
||||
1. 打开 Unity 编辑器
|
||||
2. 检查菜单 `Tools > UI` 是否存在
|
||||
3. 检查菜单 `Tools > External` 是否存在
|
||||
4. 在 Console 窗口确认无编译错误
|
||||
|
||||
---
|
||||
|
||||
**版本**: v1.2
|
||||
**适用**: StrayFog 框架 UI 拼接开发人员
|
||||
|
||||
---
|
||||
- 覆盖已有 Prefab 前确认目标路径和现有内容。
|
||||
- 不通过 UI 生成工具批量删除、移动资源或执行构建发布。
|
||||
- Unity API 必须由 Bridge 排队到 Editor 主线程执行。
|
||||
- 生成后检查 Git 差异,避免无意义重序列化其他资源。
|
||||
- JSON 递归结构出现 serialization depth warning 时检查实际生成结果;新增 Error 必须处理。
|
||||
|
||||
## 文档关联
|
||||
|
||||
> 当本文档发生变更时,应同步检查以下关联文档,避免信息不一致。
|
||||
|
||||
| 文档 | 关联原因 |
|
||||
|---|---|
|
||||
| [编辑器工具入口](README.md) | 本文件是编辑器工具模块的子文档 |
|
||||
| [UI 窗口系统](../UI窗口系统/README.md) | UI 拼接工具服务于 UI 窗口系统 |
|
||||
| [UI 界面拼接设计指南](../UI窗口系统/界面拼接.md) | 设计指南说明 JSON 驱动的界面拼接原则 |
|
||||
| [modules/模块索引.md](../../模块索引.md) | 模块索引是项目知识总入口 |
|
||||
| [rules/10-架构说明.md](../../../rules/10-架构说明.md) | 架构说明定义编辑器工具层与运行时层边界 |
|
||||
| [rules/20-开发规则.md](../../../rules/20-开发规则.md) | 编辑器工具开发规则互相引用 |
|
||||
| [rules/30-模块登记规则.md](../../../rules/30-模块登记规则.md) | 模块登记规则定义分类和状态口径 |
|
||||
| [编辑器工具入口](README.md) | 编辑器工具模块入口 |
|
||||
| [UI 窗口系统](../UI窗口系统/README.md) | 窗口框架和资源路径 |
|
||||
| [UI 界面拼接](../UI窗口系统/界面拼接.md) | 视觉与 Prefab 流程 |
|
||||
| [MCP 使用规则](MCP工具/CrystalBattle_Codex_Unity_MCP使用规则.md) | Codex 调用和安全边界 |
|
||||
|
||||
Reference in New Issue
Block a user