콘텐츠로 이동

UE5 플러그인 개발 가이드

MyPlugin/
MyPlugin.uplugin ← 플러그인 메타데이터
Source/
MyPlugin/ ← 런타임 모듈
Public/
MyPlugin.h
MyFeature.h
Private/
MyPlugin.cpp
MyFeature.cpp
MyPlugin.Build.cs
MyPluginEditor/ ← 에디터 전용 모듈 (선택)
Public/
Private/
MyPluginEditor.Build.cs
Content/ ← 플러그인 에셋
Resources/
Icon128.png
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "My Plugin",
"Description": "게임플레이 유틸리티 모음",
"Category": "Gameplay",
"EnabledByDefault": true,
"Modules": [
{
"Name": "MyPlugin",
"Type": "Runtime",
"LoadingPhase": "Default"
},
{
"Name": "MyPluginEditor",
"Type": "Editor",
"LoadingPhase": "PostEngineInit"
}
],
"Plugins": [
{ "Name": "GameplayAbilities", "Enabled": true }
]
}
Type설명
Runtime게임 런타임에 로드
RuntimeNoCommandletCommandlet 제외 런타임
Editor에디터에서만 로드
EditorNoCommandletCommandlet 제외 에디터
Developer개발 빌드에서만
Program독립 프로그램
MyPlugin.h
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
class FMyPluginModule : public IModuleInterface {
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
static FMyPluginModule& Get() {
return FModuleManager::LoadModuleChecked<FMyPluginModule>("MyPlugin");
}
// 플러그인 API
bool IsFeatureEnabled() const { return bEnabled; }
private:
bool bEnabled = false;
};
// MyPlugin.cpp
IMPLEMENT_MODULE(FMyPluginModule, MyPlugin)
void FMyPluginModule::StartupModule() {
UE_LOG(LogTemp, Log, TEXT("MyPlugin 시작"));
bEnabled = true;
// 델리게이트 등록, 서브시스템 초기화 등
}
void FMyPluginModule::ShutdownModule() {
bEnabled = false;
}
MyPlugin.Build.cs
public class MyPlugin : ModuleRules {
public MyPlugin(ReadOnlyTargetRules Target) : base(Target) {
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] {
"Core", "CoreUObject", "Engine",
"GameplayAbilities", "GameplayTags"
});
PrivateDependencyModuleNames.AddRange(new string[] {
"Slate", "SlateCore"
});
}
}
MyPluginEditor.cpp
#include "LevelEditor.h"
#include "ToolMenus.h"
void FMyPluginEditorModule::StartupModule() {
// 메뉴 등록
UToolMenus::RegisterStartupCallback(
FSimpleMulticastDelegate::FDelegate::CreateRaw(
this, &FMyPluginEditorModule::RegisterMenus));
}
void FMyPluginEditorModule::RegisterMenus() {
FToolMenuOwnerScoped OwnerScoped(this);
UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Window");
FToolMenuSection& Section = Menu->FindOrAddSection("MyPlugin");
Section.AddMenuEntryWithCommandList(
FMyPluginCommands::Get().OpenPluginWindow,
PluginCommands);
}

다른 프로젝트에서 플러그인 사용

섹션 제목: “다른 프로젝트에서 플러그인 사용”
프로젝트/Plugins/ 폴더에 플러그인 복사 또는 심볼릭 링크
.uproject 파일:
{
"Plugins": [
{ "Name": "MyPlugin", "Enabled": true }
]
}
  • .uplugin으로 모듈 목록, 로딩 단계, 의존 플러그인 선언
  • Runtime 모듈과 Editor 모듈 분리로 런타임 빌드 경량화
  • StartupModule / ShutdownModule에서 등록/해제 대칭 구조 유지
  • Build.cs에서 Public/Private 의존성 명확히 분리
  • 에디터 확장은 UToolMenus + IHasToolBarExtensibility 활용