# 06 法术编辑器(可视化工具) > **给策划/开发**:无需写一行代码,在 Godot 编辑器里用可视化表单新增、编辑、删除法术。这是 Godot 的 **EditorPlugin**(等同 Unity 的自定义 EditorWindow)。 --- ## 1. 打开编辑器 法术编辑现已并入 **游戏设计器**(`res://addons/game_designer/`,默认已在 `project.godot` 启用)。 ``` Godot 编辑器 → 底部面板 → 🎮 游戏设计器 → ✨ 法术 标签页 ``` > 独立的「法术编辑器」左下停靠面板已移除,法术统一在游戏设计器内维护。修改插件后可能需**重启 Godot 编辑器**让面板刷新。 --- ## 2. 界面说明 ``` ✨ 法术编辑器 — 字段化表单 ┌────────────────────────┐ │ 法术列表(ItemList) │ ← 所有 data/spells.json 中的法术 │ [ACTION] action_frost… │ │ [MODIFIER] modifier_pi… │ └────────────────────────┘ [➕新增] [⧉复制] [🗑删除] ──────────────────────── ID(唯一)/ 类型[动作 ACTION ▾]/ 显示名 / 描述 元素标签:[✓]火 [ ]冰 [✓]雷 [ ]水 [ ]毒 + 自定义标签框 ── 通用 meta ── 蓝耗 mana_cost / 商店价 shop_cost / 解锁价 unlock_cost ── 动态字段(随类型/子类型自动切换)── ACTION:动作种类[弹道 / 毒池 / 召唤] + 对应字段 (伤害 / 速度 / 存活 / 半径 / 伤害类型▾ / 施加状态▾ / …) MODIFIER / TRIGGER / LOGIC(logic_op▾ 子选择)各自字段 ── 其它(JSON) ── ← schema 之外的键,保留不丢 ──────────────────────── [✓应用到列表] [💾保存文件] [↻重载] 状态:…… ``` > **不再手写 meta JSON**:字段随「类型」及 ACTION 的「动作种类」/ LOGIC 的「logic_op」自动切换;只有 schema 未覆盖的非常规键才会出现在「其它(JSON)」框里(保留不丢)。 --- ## 3. 新增一个法术(操作流程) 1. 点 **➕新增** → 列表出现 `new_spell`,表单自动填入 ACTION 模板 2. 改 **ID**(如 `action_lightning`,必须全局唯一) 3. 选 **类型**(ACTION / MODIFIER / TRIGGER / LOGIC) 4. 填 **显示名 / 描述**(建议填 `tr()` 键,如 `SPELL_LIGHTNING_NAME`,见 [04 本地化](04_localization.md)) 5. 勾选 **元素标签**(火/冰/雷/水/毒 复选框,可多选;共鸣用);非元素标签填「自定义标签」框 6. 填 **meta 字段**——通用区(蓝耗/商店价/解锁价)常驻;下方动态区随类型(及 ACTION 动作种类 / LOGIC logic_op)自动列出对应字段,直接填数值即可 7. 点 **✓应用到列表** → 校验并写入内存 8. 点 **💾保存文件** → 写入 `res://data/spells.json` 9. 运行游戏(F5)→ 新法术自动出现在商店池,可购买施放 > **改完不生效?** 法术在游戏启动时由 `SpellRegistry` 加载,需要**重启游戏**(F5 重新运行)。 --- ## 4. meta 字段速查(按类型) > 下列字段现由表单**按类型自动呈现**,无需手写 JSON;本速查作为字段语义参考。`damage_type`(0物理/1火/2冰/3雷/4毒/5奥术)与 `apply_status_id`/`status_id`(0无/1燃烧/2冻结/3中毒/4潮湿/5沾油/6眩晕/7连击/8易伤)为整数枚举,表单以下拉呈现。 ### ACTION(弹道) ```json { "base_damage": 5.0, "speed": 350.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "apply_status_id": 2, "pierce": 0, "shop_cost": 20 } ``` - `apply_status_id`:命中施加状态(1=燃烧 2=冻结 3=中毒…见 `status_id.gd`),可省略 - `action_kind`:`"zone"`(地面效果)/ `"summon"`(召唤物),省略=普通弹道 ### ACTION(地面效果,毒池等) ```json { "action_kind": "zone", "radius": 200.0, "status_id": 3, "duration": 5.0, "tick_interval": 1.0, "shop_cost": 28 } ``` ### ACTION(召唤炮台) ```json { "action_kind": "summon", "lifetime": 20.0, "range": 350.0, "fire_interval": 0.8, "base_damage": 4.0, "speed": 360.0, "shop_cost": 35 } ``` ### MODIFIER(修改施法) ```json { "damage_add": 10.0, "damage_mult": 1.0, "spread_add": 1, "multicast": 1, "pierce": 2, "shop_cost": 20 } ``` ### TRIGGER(命中子母弹) ```json { "base_damage": 3.0, "speed": 250.0, "lifetime": 4.0, "radius": 6.0, "damage_type": 0, "shop_cost": 30 } ``` ### LOGIC(条件/循环) ```json { "logic_op": "every_n_shots", "n": 3, "reg": 0, "shop_cost": 24 } ``` `logic_op` 取值:`every_n_shots` / `if_hp_below`(threshold) / `if_enemy_nearby`(range) / `loop`(count) --- ## 5. 数据流(原理) ``` 法术编辑器 tab ──保存──▶ res://data/spells.json ──游戏启动加载──▶ SpellRegistry (编辑器内) (纯数据,可 git 版本管理) (注册到法术 VM) │ 商店抽取 / 背包装备 / 法术 VM 编译施放 ``` - `data/spells.json` 中的法术**优先级最高**,会覆盖 `wand_preset.gd` 里的同 ID 硬编码版本 - 不在 JSON 里的法术仍由硬编码提供(向后兼容,不会丢失现有法术) - JSON 是纯文本,可纳入 git,多人协作改法术不冲突代码 --- ## 6. 扩展方向(给开发) 同一套 EditorPlugin 模式可复制出更多可视化工具: | 工具 | 数据文件 | 对应硬编码 | |:---|:---|:---| | **法术编辑器**(已实现,game_designer tab) | `data/spells.json` | `wand_preset.gd` | | 敌人编辑器(可加) | `data/enemies.json` | `enemy_manager.gd` `_SPEED`/`_ARMOR` | | 波次编辑器(可加) | `data/waves.json` | `wave_manager.gd` `WAVE_CONFIG` | | Core 编辑器(可加) | `data/cores.json` | `wand_preset.gd` `make_*_core` | | 共鸣配方编辑器(可加) | `data/resonance.json` | `spell_evaluator.gd` `_resonance_recipes` | 实现参考 `addons/game_designer/spell_tab.gd`(字段化表单)与 `core_tab.gd`:`@tool` 脚本 + 复用 `designer_ui.gd` 辅助 + schema 驱动的动态字段 + JSON 读写 + 对应 Manager 的 `_load_json_*()` 加载方法。 > **Godot 编辑器扩展能力**:`EditorPlugin`(停靠面板/工具栏/底部面板)、`@tool`(脚本在编辑器运行)、`EditorInspectorPlugin`(自定义检视器)、自定义 `Resource`(`.tres` 自带表单)、`EditorScript`(一次性脚本)。与 Unity 的 EditorWindow/CustomEditor/ScriptableObject 一一对应,且与节点系统集成更紧。