UEのエクステンションエディターメニュー
UEがエディターメニューを拡張する方法を記録する
Hook
Hook は、拡張メニューのアンカーポイントとして理解できます。新しいメニューコマンドを Hook の前または後に設定できます。UE 標準のエディタメニューコマンドは、ほぼすべて Hook を持っています。UE5では、Edit - Editor Preferences - General - Others - Show UI Extension Points
を開くと、すべてのメニューの 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に関連する内容については詳しく説明しませんので、興味がある方は別の記事を探してご覧ください。
フック メニューの追加
例えば、「ツール - プログラミング」の中にコマンドを追加すること。
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);
}
Original: https://wiki.disenone.site/ja
This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.
Visitors. Total Visits. Page Visits.
この投稿はChatGPTによって翻訳されました。フィードバック中指摘任何遗漏之处。