Saltar a contenido

Extensión del menú del editor UE

Registra cómo UE amplía el menú del editor.

Hook

"Hook" se puede entender como un punto de anclaje para expandir el menú. Podemos configurar nuevos comandos de menú antes o después del "Hook". La mayoría de los comandos de menú incorporados en UE vienen con "Hook". En UE5, abre Editar - Preferencias del editor - General - Otros - Mostrar puntos de extensión de la interfaz de usuario para ver todos los "Hook" de los menús.

Dependencia de módulos.

Es necesario agregar los módulos de dependencia LevelEditor, Slate, SlateCore, EditorStyle, EditorWidgets, UnrealEd y ToolMenus en el archivo .Build.cs del proyecto.

PrivateDependencyModuleNames.AddRange(
    new string[]
    {
        "Core",
        "Engine",
        "CoreUObject",
        "LevelEditor",
        "Slate",
        "SlateCore",
        "EditorStyle",
        "EditorWidgets",
        "UnrealEd",
        "ToolMenus",
    }
    );

Agregar barra de menú

Por favor, traduzca el texto al español.

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);

Ejecutar el código anterior permite observar que se ha añadido una barra de menú MenuTest después de Ayuda:

Agregar comando

Utiliza la interfaz MenuBuilder.AddMenuEntry:

// Inside MenuTest Lambda
MenuBuilder.AddMenuEntry(
    FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
    FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
    {
        // do action
    })));

Coloca el código anterior dentro de la función CreateLambda para generar el comando de menú.

Utiliza MenuBuilder.BeginSection y MenuBuilder.EndSection:

MenuBuilder.BeginSection(NAME_None, FText::FromName("MenuTestSection"));
// code to create action
MenuBuilder.EndSection();

Separador

MenuBuilder.AddMenuSeparator();

El submenú es similar a la barra de menú y necesita ser definido en 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
            })));
    }));

Controles SlateUI

También se pueden agregar controles de 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()
);

El contenido relacionado con Slate UI no se detalla aquí, si estás interesado, puedes buscar otro artículo para obtener más información.

Hook aumentar menú

Por ejemplo, agregar un comando dentro de Herramientas - Programación.

MenuExtender->AddMenuExtension(
    "Programming", EExtensionHook::After,
    nullptr,
    FMenuExtensionDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)
    {
        MenuBuilder.AddMenuEntry(
        FText::FromName("MenuTestAction"), FText::FromName("MenuTestAction"),
        FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]()
        {
            // do action
        })));
    })
);

Se puede añadir otros tipos de menú de manera similar.

Código completo

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/es

This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

Este mensaje ha sido traducido utilizando ChatGPT, por favor comente en FeedbackSeñale cualquier omisión.