커스텀 기능 추가

 

커스텀 기능 추가

목적

엔진에 커스텀 기능을 추가하기

  • 기능은 각 구현 세부마다 다를 수 있으므로 창이 보이는게 목표
  • 엔진 상단에 아래와 같이 보이게 한다.

image.png

  • MatineeMenus.cpp등과 같이 기존에 작성된 엔진 코드를 참조하여 구현 합니다.

Windows옆에 드랍다운 추가

1. Build.cs수정

using UnrealBuildTool;

public class TestEditor : ModuleRules
{
    public TestEditor(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

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

        PrivateIncludePaths.Add("TestEditor/Private");
    }
}
  • “Slate”, “SlateCore”, “EditorStyle”, “UnrealEd” 을 추가 합니다.

2. 메뉴 확장자(MenuBarExtension) 추가.

  1. 레벨 에디터 모듈을 불러옵니다
  2. 메뉴 확장자를 생성 합니다.
  3. b의 확장자에 메뉴를 등록 합니다.
  4. LevelEditor가 메뉴 확장자를 사용할 수 있도록 등록 해줍니다.
void FTestEditor::StartupModule()
{
    // 메뉴 확장자 생성
    TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());

    // 메뉴 확장 바인딩
    MenuExtender->AddMenuBarExtension(
        // 붙일 메뉴 위치(창 메뉴를 기준)
        "Window",                                                                   
        // 위치 기준
        EExtensionHook::After,                                                      
        // 커맨드 리스트 (없으면 nullptr)
        nullptr,                                                                    
        // 생성된 이후 호출될 델리게이트
        FMenuBarExtensionDelegate::CreateRaw(this, &FTestEditor::AddMenuBarEntry)   
    );

    // 레벨 에디터 모듈 참조
    FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
    
    // 레벨 에디터에 메뉴 확장자 등록
    LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
}

하지만 아직 보이지 않는다..

image.png

3. FTestEditor::AddMenuBarEntry 구현

AddMenuBarExtension에 연결된 AddMenuBarEntry을 구현 해준다

void FTestEditor::AddMenuBarEntry(FMenuBarBuilder& MenuBarBuilder)
{
    MenuBarBuilder.AddPullDownMenu(
        // 드롭다운 메뉴 이름
        FText::FromString("MyDropdown"),                                    
        // 툴팁
        FText::FromString("Open My Dropdown"),                              
        // 생성후 호출될 델리게이트
        FNewMenuDelegate(),                                                 
        // 메뉴 hook (id)
        "MyDropdown"                                                        
    );
}

image.png

  • 메뉴 추가 완료

    하지만 눌러도 아무런 반응이 없다..

    ⇒ 하위에 컨텐츠들이 없어서 그렇다.

    ⇒ FNewMenuDelegate 구현 해줘야 함.

4. 드랍다운 구현

AddPullDownMenu에서 델리게이트를 구현 해준다.

  1. 델리게이트 연결

     void FTestEditor::AddMenuBarEntry(FMenuBarBuilder& MenuBarBuilder)
     {
         MenuBarBuilder.AddPullDownMenu(
             // 드롭다운 메뉴 이름
             FText::FromString("MyDropdown"),                                    
             // 툴팁
             FText::FromString("Open My Dropdown"),                              
             // 생성후 호출될 델리게이트
             FNewMenuDelegate::CreateRaw(this, &FTestEditor::FillPulldownMenu),
             // 메뉴 hook (id)
             "MyDropdown"                                                        
         );
     }
    
  2. 메뉴 구현

    메서드를 포인터로 연결 해주거나

    람다식으로 구현이 가능하다.

     void FTestEditor::FillPulldownMenu(FMenuBuilder& MenuBuilder)
     {
         MenuBuilder.AddMenuEntry(
             // 메뉴 이름
             FText::FromString("Option 1"),
             // 툴팁
             FText::FromString("Do something 1"),
             // 아이콘
             FSlateIcon(),
             // 클릭후 실행될 Action
             FUIAction(
                 //FExecuteAction = 델리게이트
                 FExecuteAction::CreateLambda([this]()
                     {
                         UE_LOG(LogTemp, Log, TEXT("Option 1 clicked Lambda!"));
                     })
             )
         );
        
         MenuBuilder.AddMenuEntry(
             FText::FromString("Option 2"),
             FText::FromString("Do something 2"),
             FSlateIcon(),
             FUIAction(FExecuteAction::CreateRaw(this, &FTestEditor::OnClickMenuFun))
         );
     }
    

image.png

GitHub Code