UE 扩展编辑器菜单
记录 UE 如何扩展编辑器菜单
Hook
Hook 可以理解为扩展菜单的锚点,我们可以设置新加的菜单命令在 Hook 的前面或者后面,UE 自带的编辑器菜单命令基本都带有 Hook,UE5 下打开 编辑 - 编辑器偏好设置 - 通用 - 其他 - 显示 UI 扩展点
来显示所有菜单的 Hook:
模块依赖
需要在项目 .Build.cs 文件里面加上依赖的模块 LevelEditor, Slate, SlateCore, EditorStyle, EditorWidgets, UnrealEd, ToolMenus:
PrivateDependencyModuleNames.AddRange(
new string[]
{
"Core",
"Engine",
"CoreUObject",
"LevelEditor",
"Slate",
"SlateCore",
"EditorStyle",
"EditorWidgets",
"UnrealEd",
"ToolMenus",
}
);
添加菜单栏
直接上代码
auto MenuExtender = MakeShared<FExtender>();
MenuExtender->AddMenuBarExtension(
"Help", EExtensionHook::After, // Create After Help
nullptr,
FMenuBarExtensionDelegate::CreateLambda([](FMenuBarBuilder& MenuBarBuilder)
{
MenuBarBuilder.AddPullDownMenu(
TEXT("MenuTest"), // Name
TEXT("MenuTest"), // Tips
FNewMenuDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
// create sub menus
}),
TEXT("MenuText")); // New Hook
})
);
FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor").GetMenuExtensibilityManager()->AddExtender(MenuExtender);
执行以上代码可以看到在 帮助 后面加上了一个菜单栏 MenuTest:
添加命令
使用接口 MenuBuilder.AddMenuEntry
:
// Inside MenuTest Lambda
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
把以上代码放到 CreateLambda 里面,即可生成菜单命令:
菜单分节
使用 MenuBuilder.BeginSection
和 MenuBuilder.EndSection
:
MenuBuilder.BeginSection(NAME_None, FText::FromName("MenuTestSection"));
// code to create action
MenuBuilder.EndSection();
分隔符
子菜单
子菜单类似菜单栏,需要在 Lambda 里面定义:
MenuBuilder.AddSubMenu(
FText::FromName("MenuTestSub"),
FText::FromName("MenuTestSub"),
FNewMenuDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestSubAction"), FText::FromName("MenuTestSubAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
}));
SlateUI 控件
还可以添加 UI 控件:
MenuBuilder.AddWidget(
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SEditableTextBox)
.MinDesiredWidth(50)
.Text(FText::FromName("MenuTestWidget"))
]
+ SHorizontalBox::Slot()
.AutoWidth()
.Padding(5, 0, 0, 0)
[
SNew(SButton)
.Text(FText::FromName("ExtendWidget"))
.OnClicked(FOnClicked::CreateLambda([]()
{
// do action
return FReply::Handled();
}))
],
FText::GetEmpty()
);
Slate UI 相关的内容这里不详细展开,有兴趣可以去另外找文章看。
Hook 增加菜单
譬如在 工具 - 编程
里面增加一个命令:
MenuExtender->AddMenuExtension(
"Programming", EExtensionHook::After,
nullptr,
FMenuExtensionDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
})
);
同理可以添加其他菜单类型。
完整代码
void BuildTestMenu()
{
auto MenuExtender = MakeShared<FExtender>();
MenuExtender->AddMenuBarExtension(
"Help", EExtensionHook::After,
nullptr,
FMenuBarExtensionDelegate::CreateLambda([](FMenuBarBuilder& MenuBarBuilder)
{
MenuBarBuilder.AddPullDownMenu(
FText::FromName("MenuTest"),
FText::FromName("MenuTest"),
FNewMenuDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
MenuBuilder.BeginSection(NAME_None, FText::FromName("MenuTestSection"));
MenuBuilder.AddMenuSeparator();
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
MenuBuilder.AddSubMenu(
FText::FromName("MenuTestSubb"),
FText::FromName("MenuTestSubb"),
FNewMenuDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestSubAction"), FText::FromName("MenuTestSubAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
}));
MenuBuilder.EndSection();
MenuBuilder.AddWidget(
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SEditableTextBox)
.MinDesiredWidth(50)
.Text(FText::FromName("MenuTestWidget"))
]
+ SHorizontalBox::Slot()
.AutoWidth()
.Padding(5, 0, 0, 0)
[
SNew(SButton)
.Text(FText::FromName("ExtendWidget"))
.OnClicked(FOnClicked::CreateLambda([]()
{
// do action
return FReply::Handled();
}))
],
FText::GetEmpty()
);
}),
"MenuTest");
})
);
MenuExtender->AddMenuExtension(
"Programming", EExtensionHook::After,
nullptr,
FMenuExtensionDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
{
MenuBuilder.AddMenuEntry(
FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
{
// do action
})));
})
);
FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor").GetMenuExtensibilityManager()->AddExtender(MenuExtender);
}
原文地址:https://wiki.disenone.site
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。
Visitors. Total Visits. Page Visits.