Editor 工具与 Utility
自动关联目录:Editor 工具与 Utility
官方依据:
Editor Utility Widgets(5.8)。该页内容为单一主题(创建与运行),本篇按其条目覆盖,并补 EUW / EUB / 资产动作的取舍——这部分官方页面没有给对比。
1. 定位
Editor Utility 是"不写 C++ 就能做编辑器工具"的方案,成本最低,应作为默认首选。
一句话定位:八成编辑器工具需求都能用 Editor Utility Widget 解决;只有它做不到时才上 C++/Slate。
2. 三种 Editor Utility
| 类型 | 父类 | 用途 |
|---|---|---|
| Editor Utility Widget(EUW) | UMG Widget | 有 UI 的工具面板 |
| Editor Utility Blueprint(EUB / Blutility) | UEditorUtilityBlueprint | 无 UI 的批处理逻辑 |
| Editor Utility Actor / 资产动作 | — | 针对场景/资源的批量操作 |
3. Editor Utility Widget(官方内容)
| 项 | 内容 |
|---|---|
| 本质 | 基于 UMG,像普通 Widget Blueprint 一样在蓝图里编辑 |
| 用途 | 修改编辑器 UI,添加自定义编辑器标签页 |
| 创建 | 内容浏览器右键 → Editor Utilities > Editor Utility Widget |
| 运行 | 右键资产 → Run Editor Utility Widget |
| 打开位置 | 显示为编辑器标签页;运行过之后会出现在 Level Editor 的 Tools 下拉菜单 → Editor Utility Widgets 分类 |
| 停靠限制 | 打开的标签页只能与 Level Editor 标签页停靠 |
| 成熟度 | 官方标为 Beta:"use caution when shipping with it" |
"只能与 Level Editor 标签页停靠"是个真实的约束——它决定了 EUW 不适合独立于关卡编辑器存在的工具。
4. 与 C++ 方案的取舍
| 维度 | EUW(UMG) | Slate + C++ |
|---|---|---|
| 编译 | 不需要 | 需要 |
| 迭代速度 | 快 | 慢 |
| 谁来改 | 策划也能改 | 要程序 |
| 停靠灵活性 | 受限 | 完全控制 |
| 复杂控件 | 受 UMG 能力限制 | 无限制 |
| 适合 | 批处理、配置面板 | 引擎原生风格的复杂工具 |
选 EUW 的默认理由不是"它更强",而是"改起来快且非程序也能改"。工具的价值取决于迭代速度。
5. 批处理工具的基本骨架
| 必备环节 | 说明 |
|---|---|
| 选择目标 | 选中的资产/Actor,或按条件遍历(见 资产注册表) |
| 干跑预览 | 批量操作前先列出"会改哪些" |
| 事务 | FScopedTransaction / unreal.ScopedEditorTransaction,让操作可撤销 |
| 标记脏 | MarkPackageDirty,让改动能被保存 |
| 失败提示 | 静默失败最可怕 |
| 进度 | 大批量要有进度条(Python 侧 ScopedSlowTask) |
"事务 + 标脏"是编辑器工具的两条硬要求:少了前者用户不敢用,少了后者改动会丢。
6. 常用 API
| API | 用途 |
|---|---|
UEditorAssetLibrary | 加载/保存/复制/删除资产 |
FAssetRegistryModule | 查询与遍历(见 资产注册表) |
GEditor->GetEditorSubsystem<U...>() | 各编辑器子系统 |
FEditorFileUtils | 文件与包操作 |
FScopedTransaction | Undo/Redo |
FMessageDialog / FNotificationInfo | 提示与通知 |
UFactory / UExporter | 导入导出 |
7. 代价与权衡
| 设计 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| EUW | 免编译、策划可改 | Beta;停靠受限 | 需要引擎原生级 UI → Slate |
| EUB(无 UI) | 更轻 | 没有界面 | 需要交互选 EUW |
| 批处理 + 事务 | 可撤销,用户敢用 | 要写事务代码 | 只读查询可省 |
| 干跑模式 | 安全 | 多写一套逻辑 | 破坏性操作必须有 |
| 用 Python 配合 | 库生态强 | 只在编辑器(见 Python 编辑器脚本) | — |
8. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 批量操作没有事务 | 无法撤销,用户不敢用 | 检查 FScopedTransaction |
忘了 MarkPackageDirty | 不提示保存,重启丢失 | 关编辑器时是否有保存提示 |
| 没有干跑就破坏性操作 | 误改大量资产 | 加预览步骤 |
| 工具改了资源但视图不同步 | 显示旧值 | 触发刷新 |
| 在非游戏线程操作 UObject | 崩 | 编辑器操作都在游戏线程 |
| 以为 EUW 能任意停靠 | 只能停靠 Level Editor | 需要自由停靠 → Slate |
| 把 Experimental/Beta 特性当稳定用 | 版本升级后行为变 | 关注成熟度标记 |
| 写死路径 | 换机器就废 | 用配置或选择对话框 |
9. 排查顺序
1. 改动丢了? → 是否 MarkPackageDirty
2. 不能撤销? → 是否包在事务里
3. 视图不同步? → 改完是否触发刷新
4. 不敢用/误操作? → 是否缺干跑预览
5. 停靠/UI 达不到要求? → 是否需要改用 Slate
6. 升级后变了? → 是否依赖 Beta/Experimental 特性参考
- Editor Extension · Slate 编辑器界面 · Python 编辑器脚本
- 资产注册表与编辑器查询 · 模块与 Subsystem
- Cook 与 DDC 基础设施(批处理与打包的关系)
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/e8cdce54.html
更新于:2026年10月10日