ToolMenus로 메뉴·툴바 명령 추가하기
22강. ToolMenus로 메뉴·툴바 명령 추가하기
1. 이번 강의에서 해결할 문제
Editor가 시작되자마자 메뉴를 직접 수정하면 ToolMenus 시스템이 아직 준비되지 않았을 수 있습니다. 등록만 하고 해제하지 않으면 Hot Reload나 Plugin 비활성화 뒤 중복 항목 또는 유효하지 않은 Delegate가 남습니다. 메뉴 추가는 UI 코드보다 등록 시점과 소유권 정리가 더 중요합니다.
2. 학습 목표
3. 핵심 개념
UToolMenus는 Unreal Editor의 메뉴와 툴바 확장 지점을 관리합니다. Plugin Module은 기능의 수명을 소유해야 합니다. 등록은 StartupModule, 실제 메뉴 확장은 ToolMenus가 준비된 Callback, 해제는 ShutdownModule에서 수행합니다.
메뉴 이름과 Section 이름은 엔진 버전이나 대상 Editor에 따라 바뀔 수 있습니다. Widget Reflector, ToolMenus 디버그 기능, 엔진 소스의 기존 등록 코드를 통해 실제 확장점을 확인합니다.
4. 단계별 실습
#pragma once
#include "Modules/ModuleManager.h"
class FDataGuardEditorModule final : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
private:
void RegisterMenus();
void OpenDataGuard();
};
#include "DataGuardEditorModule.h"
#include "ToolMenus.h"
#define LOCTEXT_NAMESPACE "FDataGuardEditorModule"
void FDataGuardEditorModule::StartupModule()
{
UToolMenus::RegisterStartupCallback(
FSimpleMulticastDelegate::FDelegate::CreateRaw(
this, &FDataGuardEditorModule::RegisterMenus));
}
void FDataGuardEditorModule::ShutdownModule()
{
if (UToolMenus::IsToolMenuUIEnabled() && UToolMenus::Get())
{
UToolMenus::UnRegisterStartupCallback(this);
UToolMenus::UnregisterOwner(this);
}
}
void FDataGuardEditorModule::RegisterMenus()
{
FToolMenuOwnerScoped OwnerScoped(this);
UToolMenu* ToolsMenu = UToolMenus::Get()->ExtendMenu(
"LevelEditor.MainMenu.Tools");
FToolMenuSection& Section = ToolsMenu->FindOrAddSection(
"DataGuard",
LOCTEXT("DataGuardSection", "Data Guard"));
Section.AddMenuEntry(
"OpenDataGuard",
LOCTEXT("OpenDataGuardLabel", "Open Data Guard"),
LOCTEXT("OpenDataGuardTooltip", "Open the project data validation tool."),
FSlateIcon(),
FUIAction(FExecuteAction::CreateRaw(
this, &FDataGuardEditorModule::OpenDataGuard)));
}
void FDataGuardEditorModule::OpenDataGuard()
{
UE_LOG(LogTemp, Display, TEXT("Data Guard requested"));
}
#undef LOCTEXT_NAMESPACE
이 단계에서는 메뉴 명령이 로그만 남깁니다. 다음 강의에서 같은 함수가 Dockable Tab을 엽니다. 아이콘을 추가할 때도 Runtime Content를 Hard Reference하지 말고 Editor Style Set의 수명과 등록·해제를 함께 설계합니다.
5. 코드가 동작하는 이유
Startup Callback은 ToolMenus가 사용할 준비가 된 뒤 RegisterMenus를 호출합니다. FToolMenuOwnerScoped가 이 Module을 항목의 소유자로 기록하므로 종료 시 UnregisterOwner(this)로 한 번에 정리할 수 있습니다. Menu Entry의 실행 Delegate는 Module 인스턴스가 살아 있는 동안만 유효합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
ToolMenus로 메뉴·툴바 명령 추가하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.