diff --git a/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs b/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs index fd38eec..32b7699 100644 --- a/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs +++ b/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs @@ -492,6 +492,48 @@ public static class ConfigLinkDatabase _tableInfoCache = null; } + /// + /// 获取所有缺少中文配置的表(displayName == name 或 description 为空) + /// + public static List GetTablesMissingChineseConfig() + { + return GetAllTableInfo().Where(table => + string.IsNullOrEmpty(table.displayName) || + table.displayName.Equals(table.tableName, StringComparison.OrdinalIgnoreCase) || + string.IsNullOrEmpty(table.description) + ).ToList(); + } + + /// + /// 检查是否存在缺少中文配置的表 + /// + public static bool HasTablesMissingChineseConfig() + { + return GetTablesMissingChineseConfig().Count > 0; + } + + /// + /// 输出缺少中文配置的表信息到控制台 + /// + public static void LogMissingChineseConfig() + { + var missingTables = GetTablesMissingChineseConfig(); + if (missingTables.Count == 0) + { + Debug.Log("[ConfigLinkViewer] 所有表均已配置中文名称和描述"); + return; + } + + StringBuilder sb = new StringBuilder(); + sb.AppendLine($"[ConfigLinkViewer] 发现 {missingTables.Count} 个表缺少中文配置:"); + foreach (var table in missingTables) + { + sb.AppendLine($" - {table.tableName}: displayName='{table.displayName}', description='{table.description}'"); + } + sb.AppendLine("建议使用智能体辅助补充中文配置。"); + Debug.Log(sb.ToString()); + } + private static void LoadSettings() { if (_settings != null) return; diff --git a/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs b/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs index 0a8ec46..2e5f804 100644 --- a/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs +++ b/Unity/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs @@ -403,14 +403,17 @@ public class ConfigLinkViewerWindow : EditorWindow EditorGUILayout.Space(); - EditorGUILayout.BeginHorizontal(GUILayout.ExpandHeight(true)); + float innerHeight = windowHeight - 80; // 减去头部和边距 + + EditorGUILayout.BeginHorizontal(GUILayout.Height(innerHeight)); float leftPanelWidth = Mathf.Clamp(windowWidth * 0.3f, 180f, 300f); float rightPanelWidth = windowWidth - leftPanelWidth - 20f; - EditorGUILayout.BeginVertical(GUILayout.Width(leftPanelWidth), GUILayout.ExpandHeight(true)); + EditorGUILayout.BeginVertical(GUILayout.Width(leftPanelWidth)); EditorGUILayout.LabelField($"配置表列表 ({filteredTables.Count}):", EditorStyles.miniBoldLabel); - relationScrollPos = EditorGUILayout.BeginScrollView(relationScrollPos, false, true, GUILayout.ExpandHeight(true)); + float scrollHeight = innerHeight - 40; // 减去标签高度和边距 + relationScrollPos = EditorGUILayout.BeginScrollView(relationScrollPos, false, true, GUILayout.Height(scrollHeight)); GUIStyle listButtonStyle = new GUIStyle(EditorStyles.label) { wordWrap = false, stretchWidth = true }; @@ -432,9 +435,9 @@ public class ConfigLinkViewerWindow : EditorWindow EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); - EditorGUILayout.BeginVertical(GUILayout.Width(rightPanelWidth), GUILayout.ExpandHeight(true)); + EditorGUILayout.BeginVertical(GUILayout.Width(rightPanelWidth)); EditorGUILayout.LabelField("当前表详情:", EditorStyles.miniBoldLabel); - detailScrollPos = EditorGUILayout.BeginScrollView(detailScrollPos, false, true, GUILayout.ExpandHeight(true)); + detailScrollPos = EditorGUILayout.BeginScrollView(detailScrollPos, false, true, GUILayout.Height(scrollHeight)); DrawCurrentTableInfo(rightPanelWidth); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); diff --git a/Unity/配置表联动查看器/ConfigLinkViewer/generate_config_link_data.py b/Unity/配置表联动查看器/ConfigLinkViewer/generate_config_link_data.py index 893653a..df5d59d 100644 --- a/Unity/配置表联动查看器/ConfigLinkViewer/generate_config_link_data.py +++ b/Unity/配置表联动查看器/ConfigLinkViewer/generate_config_link_data.py @@ -665,12 +665,31 @@ def main(): print(" AI 补全提示词(可复制发送给 AI)") print("=" * 60) print() - print("请帮我补全以下配置表联动关系配置:") + print("我需要你帮助维护配置表联动查看器的配置文件。") + print() + print(f"当前目录:{output_file.parent}") + print() + print("请:") + print("1. 读取 ConfigLinkData.json,分析所有表的配置情况") + print("2. 找出缺少中文名称(displayName == name)或描述为空的表,补充中文名称和描述") + print("3. 分析字段引用关系,为缺少联动关系的表添加 relations") + print("4. 对于 target_id 字段,通常引用对应的基础表(如 herolevel.target_id -> hero)") + print("5. 对于 xxxId/xxx_id 字段,根据前缀推断目标表(如 itemId -> prop)") + print("6. 同时更新 table_info.json(中文名称)和 ConfigLinkData.json(完整配置)") + print("7. 输出修改摘要") + print() + print("需要处理的内容:") print() for part in ai_prompt_parts: print(part) print() - print("请直接返回修改后的 JSON 配置。") + print("注意:") + print("- displayName 应该是简洁的中文名称(如\"英雄\"、\"装备\")") + print("- description 应该是清晰的功能描述(如\"英雄基础属性配置\")") + print("- relations 字段格式:{\"field\": \"字段名\", \"target\": \"目标表名\", \"targetField\": \"id\", \"description\": \"关联描述\"}") + print("- 保持 JSON 格式正确,不要添加多余逗号") + print("- table_info.json 只需更新 displayName 和 description") + print("- ConfigLinkData.json 需要更新 displayName、description 和 relations") print() diff --git a/Unity/配置表联动查看器/ConfigLinkViewer/table_info.json b/Unity/配置表联动查看器/ConfigLinkViewer/table_info.json index 6789f29..4a8176a 100644 --- a/Unity/配置表联动查看器/ConfigLinkViewer/table_info.json +++ b/Unity/配置表联动查看器/ConfigLinkViewer/table_info.json @@ -80,6 +80,15 @@ {"name": "trainbreak", "displayName": "训练突破", "description": "训练突破阶段配置"}, {"name": "trainlevel", "displayName": "训练等级", "description": "训练等级属性配置"}, {"name": "vip", "displayName": "VIP", "description": "VIP等级特权配置"}, - {"name": "dirty_words", "displayName": "敏感词", "description": "敏感词过滤库"} + {"name": "dirty_words", "displayName": "敏感词", "description": "敏感词过滤库"}, + {"name": "bigmap", "displayName": "大地图", "description": "大地图配置"}, + {"name": "collect", "displayName": "收集", "description": "收集系统配置"}, + {"name": "droplevel", "displayName": "掉落等级", "description": "掉落等级配置"}, + {"name": "dropLib", "displayName": "掉落库", "description": "掉落库配置"}, + {"name": "equipblocklevel", "displayName": "装备格挡等级", "description": "装备格挡等级配置"}, + {"name": "pet", "displayName": "宠物", "description": "宠物基础属性配置"}, + {"name": "petlevel", "displayName": "宠物等级", "description": "宠物等级成长属性配置"}, + {"name": "talent", "displayName": "天赋", "description": "天赋系统配置"}, + {"name": "talentlevel", "displayName": "天赋等级", "description": "天赋等级属性配置"} ] } diff --git a/Unity/配置表联动查看器/README.md b/Unity/配置表联动查看器/README.md index d9a0744..e6ae409 100644 --- a/Unity/配置表联动查看器/README.md +++ b/Unity/配置表联动查看器/README.md @@ -4,13 +4,13 @@ ## 功能特性 -- **配置表列表**:搜索过滤、存在性检测、支持 TXT 文件 +- **配置表管理**:搜索过滤、存在性检测、支持 TXT 文件 - **联动关系查看**:正向关联和反向引用查询,支持跳转到关联表 -- **数据格式可视化**:自动解析 item_id_num、id_lv_num 等复合格式 +- **数据格式可视化**:自动解析 `item_id_num`、`id_lv_num` 等复合格式 - **Excel 操作**:一键打开配置表,批量打开关联表 - **导出配置**:批量导出为 JSON 和 C# 代码 -- **清理空行**:自动检测并删除 Excel 中 id 列为空的垃圾数据行,支持 sharedStrings 解析 -- **跨项目适配**:基于 `ConfigLinkData.json`,一键生成骨架并由 AI 补全 +- **清理空行**:自动检测并删除 Excel 中 `id` 列为空的垃圾数据行 +- **智能体辅助**:支持 AI 智能体高效维护配置文件 ## 安装 @@ -24,82 +24,97 @@ Unity 编辑器菜单:`Tools → 配置表联动查看器` +### 界面布局 + +| 区域 | 功能 | +|------|------| +| 左侧面板 | 配置表列表,支持搜索过滤 | +| 右侧面板 | 当前表详情、联动关系、数据格式示例 | +| 顶部按钮 | 日常操作(清理空行、导出配置、刷新) | +| 配置标签页 | 路径设置、配置生成、智能体辅助 | + ### 按钮说明 -**日常数据维护:** +**日常操作:** | 按钮 | 说明 | |------|------| -| 清理Excel空行 | 扫描 Excel 文件夹,删除 id 列为空或非数字的垃圾数据行 | -| 导出配置 | 将 Excel 批量导出为游戏运行时的 JSON 和 C# 代码 | +| 清理Excel空行 | 删除 Excel 中 `id` 列为空或非数字的行 | +| 导出配置 | 将 Excel 批量导出为 JSON 和 C# 代码 | | 打开表格 | 打开当前选中表的 Excel 文件 | | 批量打开关联表 | 打开所有关联的配置表 | -**查看器配置(首次使用或跨项目时):** +**配置操作:** | 按钮 | 说明 | |------|------| -| 生成配置 | 从 Excel 文件夹扫描生成 `ConfigLinkData.json` 骨架文件(仅表名) | -| 补全配置 | 运行 Python 脚本自动识别字段引用关系,补全 `ConfigLinkData.json` | -| 刷新 | 重新加载 `ConfigLinkData.json` | -| 显示反向引用 | 查看哪些表引用了当前选中的表 | +| 生成配置 | 扫描 Excel 文件夹,生成 `ConfigLinkData.json` 骨架 | +| 补全配置 | 运行 Python 脚本,自动分析字段引用关系 | +| 刷新 | 重新加载配置文件 | ## 使用流程 -### 流程一:首次配置 / 跨项目使用 +### 首次配置 -将本工具引入新项目时,需要初始化 `ConfigLinkData.json`: +1. 切换到「配置」标签页 +2. 设置 Excel 文件夹路径 +3. 点击「生成配置」生成骨架 +4. 点击「补全配置」自动分析引用关系 -1. 点击"选择文件夹",设置 Excel 文件夹路径 -2. 点击 **"生成配置"** — 扫描 Excel 文件夹,生成骨架(只有表名,没有引用关系) -3. 点击 **"补全配置"** — 运行 Python 脚本自动分析 config JSON,补全引用关系和中文名 -4. 在左侧列表点击表名,查看联动关系是否准确 -5. 如有遗漏或不准确,手动编辑 `ConfigLinkData.json` 后点击"刷新" +### 日常维护 -### 流程二:日常数据维护 +1. 策划修改 Excel 后,点击「清理Excel空行」 +2. 点击「导出配置」生成运行时数据 -策划修改 Excel 后,需要导出给程序使用: +### 智能体辅助 -1. 点击 **"清理Excel空行"** — 清除 Excel 中 id 列为空的垃圾行 -2. 点击 **"导出配置"** — 将 Excel 批量导出为 JSON 和 C# 代码 +当需要补充中文配置或联动关系时,可使用 AI 智能体: -### 流程三:查看联动关系 +**推荐提示词模板:** -在左侧列表选中一张表,右侧面板会显示: -- 正向关联:该表引用了哪些其他表 -- 反向引用(勾选"显示反向引用"):哪些表引用了该表 -- 数据格式示例和说明 +```plaintext +请帮我维护配置表联动查看器的配置文件: +- 目录:d:\Project\Unity\YY9\YY9_game\unity\Assets\Editor\ConfigLinkViewer\ +- 补充缺失的中文名称和描述 +- 添加未识别的字段引用关系 +- 同时更新 table_info.json 和 ConfigLinkData.json +``` + +**常见场景:** + +| 场景 | 操作 | +|------|------| +| 添加新表 | 在两份文件中添加 displayName 和 description | +| 添加关联 | 在 ConfigLinkData.json 的 relations 中添加 | +| 同步配置 | 将 ConfigLinkData.json 的中文配置同步到 table_info.json | ## 数据格式说明 | 格式 | 示例 | 说明 | |------|------|------| -| item_id_num | 1001_10_5 | 类型:1001, ID:10, 数量:5 | -| type_id_num | 1001_10_5 | 类型:1001, ID:10, 数量:5 | -| id_pos_lv | 100_1_30 | ID:100, 位置:1, 等级:30 | -| id_lv_num | 100_30_5 | ID:100, 等级:30, 数量:5 | -| id_lv_num_time | 100_30_5_120 | ID:100, 等级:30, 数量:5, 时间:120秒 | -| buffid_lv | 5_3 | BuffID:5, 等级:3 | -| rune_id_num | 10_2 | 符文ID:10, 数量:2 | -| equip_id_num | 20_1 | 装备ID:20, 数量:1 | +| `item_id_num` | `1001_10_5` | 类型:1001, ID:10, 数量:5 | +| `id_lv_num` | `100_30_5` | ID:100, 等级:30, 数量:5 | +| `id_lv_count_delay` | `100_30_5_120` | ID:100, 等级:30, 数量:5, 时间:120秒 | -## ConfigLinkData.json 格式 +## 配置文件格式 + +### ConfigLinkData.json ```json { "tables": [ { - "name": "item", - "displayName": "道具表", - "description": "道具基础配置", + "name": "hero", + "displayName": "英雄", + "description": "英雄基础属性配置", "fileExtension": ".xlsx", "relations": [ { - "field": "rewards", - "target": "monster", + "field": "skill_ids", + "target": "skill", "targetField": "id", - "format": "type_id_num", - "description": "掉落奖励" + "format": "", + "description": "技能ID列表" } ] } @@ -107,107 +122,72 @@ Unity 编辑器菜单:`Tools → 配置表联动查看器` } ``` -| 字段 | 必填 | 说明 | -|------|------|------| -| name | 是 | 表名(对应 Excel 文件名,不含扩展名) | -| displayName | 否 | 显示名称,不填则用 name | -| description | 否 | 表描述 | -| fileExtension | 否 | 文件扩展名,默认 `.xlsx`,可设为 `.txt` | -| relations | 否 | 联动关系列表 | +### table_info.json(中文名称数据源) -**relations 字段:** - -| 字段 | 必填 | 说明 | -|------|------|------| -| field | 是 | 当前表的字段名 | -| target | 是 | 引用的目标表名 | -| targetField | 否 | 目标表的字段名,默认 `id` | -| format | 否 | 数据格式,如 `type_id_num` | -| description | 否 | 关系描述 | +```json +{ + "entries": [ + { + "name": "hero", + "displayName": "英雄", + "description": "英雄基础属性配置" + } + ] +} +``` ## 文件结构 ``` Assets/Editor/ConfigLinkViewer/ -├── ConfigLinkViewerWindow.cs # Unity 编辑器窗口界面 + 回调注册容器 -├── ConfigLinkDatabase.cs # 配置表数据、路径管理、格式模板(数据驱动) -├── generate_config_link_data.py # Python 脚本,支持命令行参数,自动识别字段引用关系 -├── ConfigLinkData.json # 配置文件(生成骨架后由 AI 补全) -├── settings.json # 项目路径 + 格式模板配置(零代码扩展) -├── table_info.json # 配置表中文名/描述(Python 和 C# 共用) -└── README.md # 使用文档 +├── ConfigLinkViewerWindow.cs # 编辑器窗口界面 +├── ConfigLinkDatabase.cs # 数据管理和格式解析 +├── generate_config_link_data.py # 自动分析脚本 +├── ConfigLinkData.json # 完整配置数据 +├── settings.json # 路径和格式模板配置 +├── table_info.json # 中文名/描述(共用数据源) +└── README.md # 使用文档 ``` ## 注意事项 -1. Excel 文件命名必须与配置表名一致(如 `enemy.xlsx`) -2. 路径设置后自动保存到 EditorUserSettings(多项目隔离,互不覆盖) -3. 清理空行会直接修改 Excel 源文件,建议操作前确认已提交到版本控制 -4. 清理空行支持 Excel 共享字符串(sharedStrings)解析,可正确处理 `t="s"` 类型单元格 -5. 补全配置功能需要 Python 环境,脚本位于 `generate_config_link_data.py` -6. 编辑 `ConfigLinkData.json` 后点击"刷新"按钮重新加载 +1. Excel 文件命名必须与配置表名一致(如 `hero.xlsx`) +2. 路径设置自动保存到 `EditorUserSettings`,多项目隔离 +3. 清理空行会直接修改 Excel 源文件,建议先提交版本控制 +4. 补全配置需要 Python 环境 +5. 编辑配置文件后点击「刷新」重新加载 + +## 配置文件同步规则 + +| 文件 | 存储内容 | 更新时机 | +|------|----------|----------| +| `table_info.json` | 中文名称、描述 | 添加新表或修改中文名时 | +| `ConfigLinkData.json` | 完整配置 + 联动关系 | 生成/补全配置、添加关联关系时 | ## 更新日志 -### v1.0.0 -- 配置表列表展示,支持搜索过滤和存在性检测 -- 联动关系查看,支持正向关联和反向引用查询 -- 数据格式可视化,自动解析并显示格式示例 -- 支持 TXT 文件识别 -- 左右面板自适应布局,窗口默认 900×600 -- 一键打开 Excel 文件,支持批量打开关联表 -- Excel 文件夹路径设置,自动保存到 PlayerPrefs -- 跨项目适配,点击[生成配置]扫描 Excel 文件夹生成骨架,AI 补全中文名和关联关系 -- "导出配置"按钮,一键将 Excel 批量导出为 JSON 和 C# 代码 -- "清理Excel空行"功能,自动检测并删除 Excel 中 id 列为空的垃圾数据行 -- "AI补全配置"按钮,运行 Python 脚本自动识别字段引用关系 - -### v1.0.1 -- "AI补全配置"按钮更名为"补全配置",按钮宽度和提示文案同步调整 -- 修复清理 Excel 空行时未正确解析共享字符串(sharedStrings)导致部分空行清理不干净的问题 -- 新增 `t="s"`(共享字符串引用)和 `t="inlineStr"`(内联字符串)两种单元格类型解析 -- 提取 `GetCellActualValue()` 方法,统一单元格值解析逻辑 -- README 全面优化:精简功能特性描述、重组文档结构、新增查漏补缺指南和二次校验 Prompt - ### v2.0.1 -**UI 优化:** -- 调整 ASCII 艺术画样式,支持自定义图案替换 -- 优化艺术画显示尺寸,支持更宽更矮的布局 -- 修复文字颜色显示问题,确保 ASCII 艺术画正确渲染 +- 优化智能体提示词,支持联动关系分析 +- 修复配置表列表滚动区域高度计算问题 +- 更新 Python 脚本的 AI 提示词格式 -### v2.0.0 — 零依赖重构(大版本) +### v2.0.0 — 零依赖重构 -**核心目标:** 拖入任意 Unity 项目即用,零外部依赖,配置驱动。 +- 移除所有 `MFrame` 直接引用,拖入即用 +- 新增 `settings.json`,零代码扩展格式类型 +- 新增 `table_info.json`,Python 和 C# 共用中文名数据源 +- 窗口拆分为「查看」和「配置」两个标签页 +- 编辑器启动时自动检测 MFrame 框架并绑定回调 -**破坏性变更:** -- 移除所有 `MFrame` 直接引用,编译不再依赖任何外部框架 -- Excel 路径存储从 `PlayerPrefs` 迁移至 `EditorUserSettings`(自动多项目隔离,旧路径需重新设置) -- Python 脚本入口改为 `argparse` 参数化调用(`--config-dir` / `--output` / `--table-info`) +### v1.0.1 -**新增文件:** -- `settings.json` — 项目路径 + 格式模板配置,新增格式类型只需改 JSON,重启即生效 -- `table_info.json` — 78 张配置表的中文名/描述,Python 和 C# 共用同一份数据源 +- 修复 Excel 共享字符串解析问题 +- 新增 `t="s"` 和 `t="inlineStr"` 单元格类型解析 -**UI 重构:** -- 窗口拆分为「查看」和「配置」两个标签页,日常操作和初始化设置分离 -- 「查看」页顶部精简为 3 个按钮(清理Excel空行、导出配置、刷新),按钮大小和垂直对齐统一 -- 「配置」页集中展示路径设置、Excel 文件夹、配置数据生成(生成/补全) -- 配置标签页底部展示洛天依 ASCII 彩蛋 +### v1.0.0 -**框架自动适配:** -- 新增 `ConfigLinkViewerAutoSetup`(`[InitializeOnLoad]`),编辑器启动时通过**反射**自动检测项目中的 MFrame 框架 -- 检测到 `MFrame.ConfigDeal.ExportConfig` → 自动绑定「导出配置」回调 -- 检测到 `MFrame.PathConf` + `MFrame.ConfigEditorCf` → 自动绑定 Excel 路径回退 -- 未检测到框架 → 静默跳过,用户无需任何配置,路径通过 UI 手动设置即可 - -**改动详情:** -- `ConfigLinkViewerCallbacks` 静态回调类保留,支持外部手动注册覆盖自动检测结果 -- `ConfigLinkDatabase.cs` — 格式解析从 switch-case 改为反射加载 `settings.json` 中的 `FormatTemplatesWrapper`,零代码扩展 -- `ConfigLinkDatabase.cs` — `MarkExistingTables` / `IsTableExistInConfigFolder` 的配置路径改为从 `settings.json` 的 `configFolderPath` 读取 -- `ConfigLinkViewerWindow.cs` — Python 调用侧同步传入 `--config-dir` 和 `--table-info` 参数 -- `generate_config_link_data.py` — 移除硬编码 `TABLE_INFO` 字典,改为从 `table_info.json` 加载 -- 清理 `__pycache__/` 缓存目录和已完成的优化方案文档 +- 初始版本,支持配置表列表、联动关系查看、Excel 操作 ## 许可证