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文件与包操作
FScopedTransactionUndo/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 特性

参考