Files
zeling_v2/Docs/EditorTools/00_EditorToolsPlan.md

524 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Editor Tools 规划方案
> **版本**1.0 · 2026-05
> **范围**`Assets/_Game/Scripts/Editor/` 下所有编辑器扩展的全面规划
> **关联架构**`Docs/Architecture/` 全集,重点 05/06/07/09/23
> **目标**:为策划、程序提供一套完整、一致、易维护的 Unity 编辑器工具体系
---
## 目录
1. [技术选型IMGUI vs UI Toolkit](#1-技术选型imgui-vs-ui-toolkit)
2. [工具体系总览](#2-工具体系总览)
3. [现有工具清单与评估](#3-现有工具清单与评估)
4. [新增工具详细规划](#4-新增工具详细规划)
5. [目录结构规范](#5-目录结构规范)
6. [菜单结构规范](#6-菜单结构规范)
7. [优先级与实施顺序](#7-优先级与实施顺序)
8. [共用基础设施](#8-共用基础设施)
---
## 1. 技术选型IMGUI vs UI Toolkit
### 1.1 对比矩阵
| 维度 | IMGUI | UI Toolkit |
|------|-------|------------|
| 开发速度(简单工具) | ✅ 快,代码即布局 | 🟡 需 UXML + USS + C# |
| 性能(大量列表/刷新) | 🔴 每帧重绘全部 | ✅ 虚拟化列表,增量刷新 |
| 分栏/停靠布局 | 🟡 手动计算 Rect | ✅ `TwoPaneSplitView` 内置 |
| 运行时数据绑定 | 🔴 不支持 | ✅ `INotifyValueChanged` |
| 属性绘制SerializedObject | ✅ `PropertyField` 直接用 | 🟡 `BindProperty()` 额外步骤 |
| Play Mode 实时刷新 | 🟡 依赖 `Repaint()` | ✅ 事件驱动 |
| 现有代码库一致性 | ✅ 全部现有工具使用 | 🟡 新引入 |
| Unity 版本要求 | 任意 | Unity 2022+ ✅(项目已满足)|
### 1.2 决策结论
**按工具类型分策略**,不做全局迁移:
| 工具类别 | 推荐技术 | 原因 |
|---------|---------|------|
| 运行时调试监视器EventBusMonitor、PlayModeOverlay | **IMGUI** | 每帧刷新状态简单IMGUI 够用且响应快 |
| 简单属性绘制器PropertyDrawer、CustomEditor | **IMGUI** | `PropertyField` + `EditorGUI` 即可,无需 UXML |
| 验收工具VerificationHelperWindow | **IMGUI** | 已有,稳定,无改造价值 |
| 一次性脚手架工具SceneScaffoldTools | **IMGUI MenuItems** | 无窗口 UI只是菜单触发 |
| 数据浏览 + 编辑窗口(武器/技能/敌人/护符) | **UI Toolkit** | 分栏布局、可搜索列表、大量字段UI Toolkit 优势明显 |
| Dashboard 总入口 | **UI Toolkit** | 模块导航卡片,视觉丰富 |
| Boss 技能序列可视化 | **IMGUI**(现有保留) | 甘特图自绘IMGUI Rect 更直接 |
---
## 2. 工具体系总览
按功能分为五大类:
```
A. 数据管理窗口 — 浏览 / 创建 / 编辑 ScriptableObject 资产
B. Prefab 配置工具 — 武器 / 技能 / 敌人 HitBox Prefab 结构验证与快速搭建
C. 场景工具 — 场景脚手架、World 物体快速放置
D. 运行时调试工具 — Play Mode 下数据监视 / 状态覆写
E. 验收 / 构建工具 — SO 合法性校验、构建前检查、Physics2D 矩阵
```
---
## 3. 现有工具清单与评估
### 3.1 保留不变Stable
| 文件 | 类型 | 菜单路径 | 状态 |
|------|------|----------|------|
| `Verification/VerificationHelperWindow.cs` | IMGUI Window | `BaseGames/Verification/Open Verification Helper` | ✅ 保留 |
| `Verification/Physics2DLayerReport.cs` | IMGUI MenuItem | `BaseGames/Verification/Check|Fix Physics2D Layer Matrix` | ✅ 保留 |
| `Verification/ExtraScaffoldExtensions.cs` | IMGUI MenuItems | `BaseGames/Verification/Scaffold/…` | ✅ 保留 |
| `Verification/PlayModeDebugOverlay.cs` | IMGUI Overlay | Play Mode UI | ✅ 保留 |
| `EventBusMonitorWindow.cs` | IMGUI Window | `BaseGames/Tools/Event Bus Monitor` | ✅ 保留 |
| `EventChainEditorWindow.cs` | IMGUI Window | `BaseGames/Tools/Event Chain Viewer` | ✅ 保留 |
| `BossSkillSequenceWindow.cs` | IMGUI Window | `BaseGames/Tools/Boss Skill Sequence Viewer` | ✅ 保留 |
| `AddressReferenceGraphWindow.cs` | IMGUI Window | `BaseGames/Tools/Asset Reference Graph` | ✅ 保留 |
| `AddressableBatchTool.cs` | IMGUI MenuItem | — | ✅ 保留 |
| `AddressKeyValidator.cs` | Build Preprocessor | — | ✅ 保留 |
| `NavSurfaceBakeShortcut.cs` | MenuItem | — | ✅ 保留 |
| `ScriptExecutionOrderTools.cs` | MenuItem | — | ✅ 保留 |
| `SceneScaffoldTools.cs` | IMGUI MenuItem | `BaseGames/Scene/…` | ✅ 保留(已更新 WeaponSocket|
| `Validation/SOValidationRunner.cs` | Build Preprocessor + MenuItem | `Tools/Validate All ScriptableObjects` | ✅ 保留 |
| `Equipment/CharmEffectDrawer.cs` | IMGUI CustomEditor | Inspector | ✅ 保留 |
| `Combat/HurtBoxEditor.cs` | IMGUI CustomEditor | Inspector | ✅ 保留 |
| `Map/MapRoomDataEditor.cs` | IMGUI CustomEditor | Inspector | ✅ 保留 |
| `World/DestructibleTileEditor.cs` | IMGUI CustomEditor | Inspector | ✅ 保留 |
| `Achievements/AchievementSOEditor.cs` | IMGUI CustomEditor | Inspector | ✅ 保留 |
### 3.2 待改造Migrate
| 文件 | 问题 | 建议 |
|------|------|------|
| `CreateTestAssets.cs` | 硬编码文件路径和资产名,缺乏可配置性 | 保留 MenuItem 逻辑,抽取配置到 SO |
| `CreateEventChannelAssets.cs` | 功能可并入新 Dashboard | 长期合并 |
| `EventChannelEditor.cs` / `EventConfigEditor.cs` | 独立 Inspector 扩展,无窗口化需求 | 保留但评估是否并入 Dashboard |
---
## 4. 新增工具详细规划
### W-01 · BaseGames Dashboard总入口
**文件**`Editor/Dashboard/EditorDashboardWindow.cs`
**技术**UI Toolkit
**菜单**`BaseGames/Open Dashboard (Ctrl+Shift+D)`
**优先级**P2其他窗口完成后汇总入口
**功能**
- 模块导航卡片Combat / Player / Enemy / Equipment / World / Tools
- 每个卡片点击打开对应数据管理窗口
- 快速链接Scene Scaffold、Validation Runner、Verification Helper
- 状态摘要:当前场景资产统计、未完成 SO 验证警告数
---
### W-02 · Weapon Editor武器编辑器
**文件**`Editor/Combat/WeaponEditorWindow.cs`
**技术**UI Toolkit`TwoPaneSplitView`
**菜单**`BaseGames/Data/Weapon Editor`
**优先级****P1**(武器 HitBox 动态化后,数据创建频率增高)
**布局**
```
┌────────────────┬──────────────────────────────────────────┐
│ [搜索框] │ [WeaponType 标签] Weapon_SkyBlade │
│ ────────── │ ──────────────────────────────────────── │
│ ■ SkyBlade │ 基础信息 weaponId / displayName … │
│ ■ EarthHammer │ ────────── │
│ ■ LifeScythe │ 连击动画 attack1Clip … downAttackClip│
│ + [新建] │ ────────── │
│ │ 伤害来源 attack1Source … ×6 │
│ │ ────────── │
│ │ HitBox Prefab [对象字段] [定位 Prefab] │
│ │ ────────── │
│ │ 战斗参数 soulPowerGain / weaponType │
│ │ 武器特效 VFXConfig 折叠面板 │
└────────────────┴──────────────────────────────────────────┘
```
**特有功能**
- **HitBox Prefab 验证**:检查引用 Prefab 是否包含 `WeaponHitBoxInstance` 组件,否则显示警告
- **伤害来源快速新建**:每个 `DamageSourceSO` 字段旁放 [Create] 按钮,自动命名 `DSrc_{weaponId}_{segment}` 并存入 `Assets/_Game/Data/Combat/DamageSources/`
- **连击链预览**:显示 attack1→attack2→attack3 的 Clip 名称 + BaseDamage 数值序列
---
### W-03 · Skill Editor技能编辑器
**文件**`Editor/Skills/SkillEditorWindow.cs`
**技术**UI Toolkit
**菜单**`BaseGames/Data/Skill Editor`
**优先级****P1**
**布局**:与 W-02 类似的双栏结构
**左栏**
-`SkillEffectType` 分组MeleeAoE / Projectile / BarrierAura / …)
- 搜索框(按 skillId / displayNameKey 过滤)
**右栏**
- Identity / Resource / Animation / Effect / Projectile / Explosion / Feedback 分区折叠面板
- `SkillHitBoxPrefab` 字段:若非空,显示 Prefab 结构预览(`SkillHitBoxInstance` 子节点个数 + HitBox 列表)
**特有功能**
- **冷却 / 消耗平衡表**:底部浮动 Panel以表格展示所有技能的 `baseCost` / `cooldown` 对比,辅助策划平衡调整
- **HitBox Prefab 快速创建向导**:填写 skillId → 自动生成 `SKL_{skillId}_HitBox.prefab` 骨架(含 `SkillHitBoxInstance` + 子节点 HitBox GO
---
### W-04 · Form & Weapon Assignment形态-武器-技能关联)
**文件**`Editor/Player/FormEditorWindow.cs`
**技术**UI Toolkit
**菜单**`BaseGames/Data/Form Editor`
**优先级**P2
**布局**:三列
```
[FormSO 列表] → [当前形态详情] → [技能/武器预览面板]
```
**功能**
- 显示所有 `FormSO`,点击进入详情
- 详情显示:`defaultWeapon`(链接到 W-02`soulSkill` / `spirit1` / `spirit2`(链接到 W-03
- 矩阵视图:所有形态 × 三个技能槽的全局总览(快速发现空槽)
---
### W-05 · Enemy Data Manager敌人数据管理器
**文件**`Editor/Enemies/EnemyDataWindow.cs`
**技术**UI Toolkit
**菜单**`BaseGames/Data/Enemy Data Manager`
**优先级****P1**(敌人设计是高频迭代内容)
**布局**:双栏,左侧 `ListView`(支持搜索 + 按 EnemyType 过滤)
**右栏分页**
- **Stats**`EnemyStatsSO` 全字段MaxHP / Attack / Defense / Speed / …)
- **Loot**`LootTableSO` 条目列表itemId / weight / minCount / maxCount可增删
- **Boss**:若为 Boss显示关联 `BossSkillSO` 列表(链接 BossSkillSequenceWindow
- **Prefab**:关联 Prefab 路径 + 结构验证HurtBox Layer、EnemyBase、HitBox 等)
**特有功能**
- **数值对比面板**勾选多个敌人弹出雷达图HP / ATK / DEF / SPD对比
- **快速克隆**:从选中 `EnemyStatsSO` 克隆变体(命名 `EnemyStats_{name}_Elite`
---
### W-06 · Charm Catalog Manager护符目录管理器
**文件**`Editor/Equipment/CharmCatalogWindow.cs`
**技术**UI Toolkit
**菜单**`BaseGames/Data/Charm Catalog`
**优先级**P2
**布局**:双栏
**左栏**:护符列表,按 `notchCost` / Effect 类型过滤
**右栏**:护符详情
- `notchCost` / `icon` / `displayNameKey`
- Effects 列表(沿用现有 `CharmEffectDrawer` 逻辑,移植为 UI Toolkit `BindableElement`
- 效果描述预览(调用 `GetEffectDescription()`
**特有功能**
- **Notch 平衡面板**:饼图展示当前所有护符 notchCost 分布
- **效果类型矩阵**:护符 × 效果类型的覆盖矩阵,发现重复/空缺
---
### W-07 · Prefab Structure ValidatorPrefab 结构验证器)
**文件**`Editor/Prefabs/PrefabValidatorWindow.cs`
**技术**IMGUI简单列表无复杂布局需求
**菜单**`BaseGames/Tools/Prefab Structure Validator`
**优先级**P2
**功能**:扫描以下 Prefab 命名规范并验证结构完整性:
| Prefab 类型 | 命名规范 | 必须包含组件 |
|------------|---------|------------|
| 武器 HitBox | `WPN_{weaponId}_HitBox` | `WeaponHitBoxInstance` + ≥1 `HitBox` |
| 技能 HitBox | `SKL_{skillId}_HitBox` | `SkillHitBoxInstance` + ≥1 `HitBox` |
| 玩家 | `PLY_Player` | `PlayerController` `WeaponManager._weaponSocket` 非空 |
| 敌人 | `ENM_*` | `EnemyBase` `HurtBox`Layer=EnemyHurtBox|
| 投射物 | `PRJ_*` | `Projectile` `Collider2D`IsTrigger|
**输出**Console 日志 + 窗口内可点击跳转的错误列表
---
### W-08 · Interactable Scene Helper场景交互物配置助手
**文件**`Editor/World/InteractableSceneHelper.cs`
**技术**IMGUIScene View 工具栏扩展 + 小窗口)
**菜单**`BaseGames/Scene/Interactable Helper`
**优先级**P3
**功能**
- 在 Scene View 工具栏添加快速放置按钮SavePoint / RoomTransition / HazardZone / Collectible / DestructibleTile / MovingPlatform / AbilityUnlock
- 放置时自动设置 Layer、添加必要子节点、绑定默认事件频道
- 复用 `SceneScaffoldTools` 中的 `GetOrAddComponent` / `SetLayer` 私有方法(提取为 `EditorScaffoldUtils` 公共静态类)
---
### W-09 · DamageSource Inspector 增强
**文件**`Editor/Combat/DamageSourceInspector.cs`
**技术**IMGUI CustomEditor
**优先级**P2
**功能**
-`DamageSourceSO` Inspector 底部添加**伤害预览区**
- 显示 `FinalDamage ≈ BaseDamage × DamageMultiplier`(含示例防御减免)
- `DamageFlags` / `DamageTags` 用枚举 Toggle 组显示,替代默认位掩码数字
- `BreakLevel` 字段以颜色编码标签显示None=灰 / Light=绿 / Medium=蓝 / Heavy=橙 / Breaker=红)
---
### W-10 · WeaponHitBox Prefab 快速创建向导
**文件**`Editor/Combat/WeaponHitBoxWizard.cs`
**技术**IMGUI `ScriptableWizard`
**菜单**`BaseGames/Create/Weapon HitBox Prefab`
**优先级****P1**(与 WeaponSO 动态化改造配套)
**流程**
1. 输入 `weaponId`(如 `SkyBlade`
2. 勾选需要的攻击方向Ground / Up / Down / Air
3. 为每个方向选择 Collider 类型Box / Capsule / Polygon和初始尺寸
4. 点击「创建」→ 在 `Assets/Prefabs/Weapons/` 下生成:
```
WPN_SkyBlade_HitBox.prefab
└── [HitBox_Ground] BoxCollider2D(IsTrigger) + HitBox.cs Layer=PlayerHitBox
└── [HitBox_Up] …
└── [HitBox_Down] …
└── [HitBox_Air] …
WeaponHitBoxInstance.cs挂在根节点SerializeField 自动赋值)
```
5. 自动 Ping 创建的 Prefab 并选中
---
### W-11 · SkillHitBox Prefab 快速创建向导
**文件**`Editor/Skills/SkillHitBoxWizard.cs`
**技术**IMGUI `ScriptableWizard`
**菜单**`BaseGames/Create/Skill HitBox Prefab`
**优先级****P1**
与 W-10 类似,生成:
```
SKL_{skillId}_HitBox.prefab
└── [HitBox_0] PolygonCollider2D(IsTrigger) + HitBox.cs Layer=PlayerHitBox
SkillHitBoxInstance.cs根节点_hitBoxes 自动赋值)
```
---
## 5. 目录结构规范
```
Assets/_Game/Scripts/Editor/
├── BaseGames.Editor.asmdef
├── Dashboard/
│ └── EditorDashboardWindow.cs [新增 W-01] UI Toolkit
├── Combat/
│ ├── HurtBoxEditor.cs [现有]
│ ├── DamageSourceInspector.cs [新增 W-09] IMGUI CustomEditor
│ ├── WeaponEditorWindow.cs [新增 W-02] UI Toolkit
│ └── WeaponHitBoxWizard.cs [新增 W-10] IMGUI Wizard
├── Skills/
│ ├── SkillEditorWindow.cs [新增 W-03] UI Toolkit
│ └── SkillHitBoxWizard.cs [新增 W-11] IMGUI Wizard
├── Player/
│ └── FormEditorWindow.cs [新增 W-04] UI Toolkit
├── Enemies/
│ └── EnemyDataWindow.cs [新增 W-05] UI Toolkit
├── Equipment/
│ ├── CharmEffectDrawer.cs [现有]
│ └── CharmCatalogWindow.cs [新增 W-06] UI Toolkit
├── Prefabs/
│ └── PrefabValidatorWindow.cs [新增 W-07] IMGUI
├── World/
│ ├── DestructibleTileEditor.cs [现有]
│ └── InteractableSceneHelper.cs [新增 W-08] IMGUI
├── Map/
│ └── MapRoomDataEditor.cs [现有]
├── Achievements/
│ └── AchievementSOEditor.cs [现有]
├── Validation/
│ └── SOValidationRunner.cs [现有]
├── Verification/
│ ├── VerificationHelperWindow.cs [现有]
│ ├── ExtraScaffoldExtensions.cs [现有]
│ ├── Physics2DLayerReport.cs [现有]
│ └── PlayModeDebugOverlay.cs [现有]
├── Shared/
│ │ ← 跨窗口复用的基础设施
│ ├── EditorScaffoldUtils.cs [新增] SceneScaffoldTools 公共工具提取
│ └── EditorWindowBase.cs [新增] 统一 OnEnable/OnGUI 基类UI Toolkit 窗口)
└── UIToolkit/
├── Editor.uss [新增] 统一样式表
└── Layouts/
├── TwoPaneWindow.uxml [新增] 标准双栏布局模板
└── AssetListItem.uxml [新增] 资产列表行模板
```
---
## 6. 菜单结构规范
```
BaseGames/
├── Open Dashboard (Ctrl+Shift+D) W-01
├── Data/
│ ├── Weapon Editor W-02
│ ├── Skill Editor W-03
│ ├── Form Editor W-04
│ ├── Enemy Data Manager W-05
│ └── Charm Catalog W-06
├── Create/
│ ├── Weapon HitBox Prefab W-10
│ └── Skill HitBox Prefab W-11
├── Scene/
│ ├── Scaffold Persistent Scene (现有)
│ ├── Scaffold Test Room (现有)
│ └── Interactable Helper W-08
├── Tools/
│ ├── Event Bus Monitor (Ctrl+Shift+E) (现有)
│ ├── Event Chain Viewer (现有)
│ ├── Boss Skill Sequence Viewer (现有)
│ ├── Asset Reference Graph (现有)
│ ├── Prefab Structure Validator W-07
│ └── Create Test Assets (现有)
└── Verification/
├── Open Verification Helper (Ctrl+Shift+V)(现有)
├── Check Physics2D Layer Matrix (现有)
├── Fix Physics2D Layer Matrix (现有)
└── Scaffold/… (现有)
```
---
## 7. 优先级与实施顺序
### P1 — 配套当前架构改动,立即需要
| ID | 名称 | 关联改动 | 工作量估计 |
|----|------|---------|----------|
| W-10 | WeaponHitBox Prefab 向导 | WeaponSO.hitBoxPrefab 动态化 | S0.5d|
| W-11 | SkillHitBox Prefab 向导 | SkillHitBoxPrefab 已有字段 | S0.5d|
| W-02 | Weapon Editor 窗口 | WeaponSO 字段增多 | M2d|
| W-03 | Skill Editor 窗口 | FormSkillSO 字段多 | M2d|
| W-05 | Enemy Data Manager | 高频策划迭代 | M2d|
| W-09 | DamageSource Inspector 增强 | DamageSourceSO 易配错 | S0.5d|
### P2 — 生产力提升,下一迭代
| ID | 名称 | 工作量估计 |
|----|------|----------|
| W-07 | Prefab 结构验证器 | S1d|
| W-04 | Form Editor | S1d|
| W-06 | Charm Catalog 管理器 | M1.5d|
### P3 — 长期完善
| ID | 名称 | 工作量估计 |
|----|------|----------|
| W-08 | 场景交互物助手 | M2d|
| W-01 | Dashboard 总入口 | M2d|
---
## 8. 共用基础设施
### 8.1 EditorScaffoldUtils从 SceneScaffoldTools 提取)
将 `SceneScaffoldTools.cs` 中的私有静态方法提取为独立公共类:
```csharp
// Editor/Shared/EditorScaffoldUtils.cs
namespace BaseGames.Editor
{
public static class EditorScaffoldUtils
{
public static Transform GetOrCreateChild(Transform parent, string name);
public static T GetOrAddComponent<T>(GameObject go) where T : Component;
public static void SetLayer(GameObject go, string layerName, List<string> report);
public static void AssignReference(Object target, string field, Object value, List<string> report = null);
public static void AssignAsset<T>(Object target, string field, List<string> report,
bool required, string assetNameHint) where T : Object;
public static void MarkDirtyAndLog(string scaffoldName, Object root, List<string> report);
}
}
```
> `SceneScaffoldTools` 和 `ExtraScaffoldExtensions` 改为调用此工具类,消除重复代码(当前 `ExtraScaffoldExtensions` 注释"镜像 SceneScaffoldTools 中的 private 静态方法"即为此痛点)。
### 8.2 UI Toolkit 统一样式
`Editor/UIToolkit/Editor.uss`
```css
/* 标准分区标题 */
.section-header { font-size: 11px; -unity-font-style: bold; margin-top: 8px; }
/* 警告行 */
.row-warning { background-color: rgba(220, 150, 0, 0.15); }
.row-error { background-color: rgba(220, 50, 50, 0.15); }
/* 列表项高亮 */
.list-item:hover { background-color: rgba(255,255,255,0.05); }
```
### 8.3 SO 创建辅助
所有数据窗口的「新建」按钮使用统一签名:
```csharp
// 返回创建的资产路径;已存在时返回 null不覆盖
public static T CreateSOAsset<T>(string folder, string assetName) where T : ScriptableObject
{
string dir = $"Assets/_Game/Data/{folder}";
string path = $"{dir}/{assetName}.asset";
if (AssetDatabase.LoadAssetAtPath<T>(path) != null) return null;
Directory.CreateDirectory(Path.Combine(Application.dataPath, $"../{dir}"));
var asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, path);
AssetDatabase.SaveAssets();
EditorGUIUtility.PingObject(asset);
return asset;
}
```
---
*文档维护:每次新增或修改 Editor 工具后,同步更新本文档的「现有工具清单」表格。*