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.uplugin 파일
섹션 제목: “.uplugin 파일”{ "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 | 게임 런타임에 로드 |
RuntimeNoCommandlet | Commandlet 제외 런타임 |
Editor | 에디터에서만 로드 |
EditorNoCommandlet | Commandlet 제외 에디터 |
Developer | 개발 빌드에서만 |
Program | 독립 프로그램 |
모듈 구현
섹션 제목: “모듈 구현”#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.cppIMPLEMENT_MODULE(FMyPluginModule, MyPlugin)
void FMyPluginModule::StartupModule() { UE_LOG(LogTemp, Log, TEXT("MyPlugin 시작")); bEnabled = true; // 델리게이트 등록, 서브시스템 초기화 등}
void FMyPluginModule::ShutdownModule() { bEnabled = false;}Build.cs 의존성
섹션 제목: “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" }); }}에디터 확장 모듈
섹션 제목: “에디터 확장 모듈”#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활용