自定义编辑器教程

这是一个关于如何创建自定义编辑器视口的教程

1、前言

虚幻引擎的新手可能不理解编辑器的重要性。
编辑器非常重要。我待过的游戏公司曾因为糟糕的、卡顿的编辑器功能而苦苦挣扎。
高性能、直观的自定义编辑器界面能够帮助设计师实现他们新奇的想法。
可以肯定地说,编辑器是游戏开发的基石。

2、相关资料

相关问题
UNREAL FEST 2024上介绍的视频
Youtube版本

3、特别感谢

感谢 Unreal Fest 2024。官方给出了一个关于扩展编辑器的几种方法的非常好的演示。
下面我将进行总结:

4、官方提供的扩展编辑器的方式满足了以下几点

1、不改引擎、高重用性、快速迭代、方便管理
2、提高生产力、减少样板代码,简化任务,尽早预防问题。
3、原生、直观、集成。(意思是兼容性很好。)
4、引擎中有实现的例子,可以直接复制粘贴!

5、目录

1、入门级框架:

Scripted Actions (BP)
Data Validators (BP and C++)
Slate Notifications (C++)

2、中级框架:

Custom Details Panels (C++)
Component Visualizers (C++)
Custom Assets (C++)
Advanced Asset Editors (C++)

3、示例和参考资料

可下载的演示文稿和项目
引擎类参考资料和有用的链接

6、Scripted Actions (BP) 脚本动作(建议由蓝图实现,但C++也行)

如果选蓝图,脚本只能在Editor Utility Blueprint写。
目前只有两个父类负责脚本动作,它们分别是:
1、Asset Action Utility(我没复现出来)
2、Actor Action Utility(我测试没问题)
它们的ClassDefaults里都有个SupportedClasses,它代表哪些资产或actor可以使用这个脚本。
Asset Action Utility的ClassDefaults还有个Is Action for Blueprints和Supported Conditions。
在它们中创建任何的Call in editor为true的函数都可以在右键后的Script actions中进行调用。

7、Data Validators (BP and C++) 数据验证

如果选蓝图,脚本只能在Editor Utility Blueprint写。
目前只有一个父类负责脚本动作:
1、EditorValidatorBase
继承之后有两个函数:
CanValidate 用于区分资产
ValidateLoadedAsset 用于验证的逻辑
如果选C++,那么事情就简单了
需要override的函数是:UObject::IsDataValid
C++的这个可能会涉及到改引擎,但是蓝图的就特别有用了!
举个例子:不懂程序的美术可能会在天上疯狂打光,那么监控打光的数量和参数,避免美术乱打光!
推荐工具组关注这块儿。

8、Slate Notifications (C++)

这个就只能在C++里写了。这个是用来给编辑器用户提示的。能在右下角弹出操作的评价。
总的来说就一个函数:

TSharedPtr<SNotificationItem> FSlateNotificationManager::AddNotification(const FNotificationInfo& Info)

想办法构建一个FNotificationInfo然后调用就行了。

9、Custom Details Panels (C++)

自定义细节面板
创建一个类继承自IDetailCustomization,然后override函数CustomizeDetails
然后获取FPropertyEditorModule模块,调用RegisterCustomClassLayout
具体怎么修改的函数都在CustomizeDetails的IDetailBuilder里。

10、Component Visualizers (C++)

只有两个类
FComponentVisualizer 继承之后override函数DrawVisualization或者DrawVisualizationHUD
HComponentVisProxy 这个比较复杂,说是允许绘制之后的东西进行交互。

  1. Inherit from HComponentVisProxy and add DECLARE_HIT_PROXY()
struct HPatrolPointProxy: public HComponentVisProxy
{
  DECLARE_HIT_PROXY();
  int32 ld;
  HPatrolPointProxy(const UActorComponent* InComponent, const int32 PatrolPointld):
  HComponentVisProxy(InComponent, HPP_Wireframe), ld(Patrollointld){}
}
  1. Add the Macro IMPLEMENT_HIT_PROXY() at the top cof your.cpp file
IMPLEMENT_HIT_PROXY(HPatrolPointProxy, HComponentVisProxy)

Custom Assets (C++)
Advanced Asset Editors (C++)