에디터 모듈(Editor modules) 은 에디터 빌드에 대해서만 코드가 컴파일되는 언리얼 엔진 (UE) C++ 모듈입니다. 이를 통해 런타임(출시) 빌드 크기를 늘리지 않고 커스텀 에디터 기능을 지원하는 클래스를 쉽게 생성할 수 있습니다.
에디터 모듈을 구성하려면 런타임 모듈 구성보다 몇 가지 추가 단계가 필요한데, 모듈 클래스를 사용하여 디테일 패널 커스터마이제이션 또는 커스텀 에디터 창을 등록해야 하는 경우가 많기 때문입니다. 이 가이드에서는 이러한 목표를 염두에 두고 에디터 모듈을 구성하는 프로세스를 안내합니다.
모듈의 디렉터리 구조체 구성하기
프로젝트의 소스 디렉터리에서 런타임 및 에디터 모듈 모두에 대한 폴더를 추가한 다음, 각각에 Private 및 Public 폴더를 추가합니다. 그 예시는 다음과 같습니다.
- CustomGameplay
- Private
- Public
- CustomGameplayEditor
- Private
- Public
이 예시에서 CustomGameplay 모듈은 런타임 모듈이고 CustomGameplayEditor 모듈은 에디터 모듈로서 CustomGameplay에서 클래스와 타입을 지원하는 에디터 커스터마이제이션을 제공합니다.
CustomGameplay 모듈은 에디터 및 런타임 빌드 모두에 대해 코드를 컴파일하지만, CustomGameplayEditor 모듈은 에디터 빌드에 대해서만 코드를 컴파일하는데, 왜냐하면 에디터 커스터마이제이션을 위한 코드는 프로젝트를 출시할 때 필요하지 않기 때문입니다.
에디터 기능을 런타임 및 에디터 모듈로 병렬 구성하는 것을 권장합니다. 이렇게 하면 특정 에디터 모듈이 지원해야 하는 클래스나 게임플레이 기능을 명확하게 하고, 강력한 캡슐화 감각을 유지할 수 있습니다. 런타임 모듈의 이점에 대한 자세한 내용은 언리얼 엔진 모듈을 참조하세요.
Private 및 Public 폴더 이름의 첫 문자는 대문자여야 합니다. Windows는 대소문자를 구분하지 않지만, 많은 소스 컨트롤 시스템은 구분하며, 폴더 이름의 첫 문자로 대문자를 사용하면 중복 폴더가 나오지 않게 할 수 있습니다.
런타임 모듈 채우기
런타임 모듈에 대한 보일러플레이트 클래스를 채우는 방법은 다음과 같습니다.
-
CustomGameplay 폴더에
CustomGameplay.Build.cs라는 파일을 생성합니다. 파일에 다음과 같은 내용을 채웁니다.CustomGameplay.Build.cs
using UnrealBuildTool; public class CustomGameplay: ModuleRules { public CustomGameplay(ReadOnlyTargetRules Target) : base(Target) { PrivateDependencyModuleNames.AddRange(new string[] {"Core", "CoreUObject", "Engine"}); } }코드 지원에 무엇이 필요하냐에 따라 퍼블릭 또는 프라이빗 종속성을 추가합니다.
-
CustomGameplay/Private에
CustomGameplayModule.cpp라는 파일을 생성하고 다음과 같이 구현합니다.CustomGameplayModule.cpp
#include "Modules/ModuleManager.h" IMPLEMENT_MODULE(FDefaultModuleImpl, CustomGameplay);
이 예시를 위해서는 이 디폴트 구현으로 충분합니다. 에디터 모듈에는 더 자세한 모듈 클래스 구현에 대한 예시가 있습니다.
에디터 모듈 채우기
에디터 모듈에 대한 보일러플레이트 코드를 구성하는 것은 런타임 모듈에 대한 구성 프로세스와 비슷하지만, 슬레이트 UI 프레임워크(Slate UI framework)를 포함하기 위해, 그리고 에디터 기능을 초기화하고 클린업하기 위한 시작 및 종료 모듈을 제공하기 위해 몇 가지 수정이 필요합니다.
-
CustomGameplayEditor 폴더에
CustomGameplayEditor.Build.cs라는 파일을 생성합니다. 파일에 다음과 같은 내용을 채웁니다.CustomGameplayEditor.Build.cs
using UnrealBuildTool; public class CustomGameplayEditor: ModuleRules { public CustomGameplayEditor(ReadOnlyTargetRules Target) : base(Target) { PrivateDependencyModuleNames.AddRange(new string[] {"Core", "CoreUObject", "Engine", "CustomGameplay", "Slate", "SlateCore"}); } }이 파일에는 편집기 커스터마이징에 사용될 Slate 및 SlateCore 가 포함되어 있습니다. 또한, 이 파일은 CustomGameplay의 클래스에 대한 에디터를 제공하는 용도이므로 CustomGameplay가 종속성으로 포함되어 있습니다. 이 파일을 통해 이러한 모듈에 대한 노출을 제공할 필요가 없으므로 이는 프라이빗 종속성으로 설정됩니다.
-
CustomGameplayEditor/Public 폴더에
CustomGameplayEditorModule.h라는 파일을 생성합니다. 파일에 다음과 같은 내용을 채웁니다.CustomGameplayEditorModule.h
#pragma once #include "Modules/ModuleInterface.h" #include "Modules/ModuleManager.h" class FCustomGameplayEditorModule : public IModuleInterface { public: virtual void StartupModule() override; virtual void ShutdownModule() override; };이렇게 하면 이 모듈에 대한
StartupModule함수와ShutdownModule함수가 노출되며, 이러한 함수는 커스텀 에디터 함수 및 서브시스템을 등록하고 클린업하는 데 사용됩니다. -
CustomGameplayEditor/Private 폴더에
CustomGameplayEditorModule.cpp라는 파일을 생성합니다. 파일에 다음과 같은 내용을 채웁니다.CustomGameplayEditorModule.cpp
#include "CustomGameplayEditorModule.h" IMPLEMENT_GAME_MODULE(FCustomGameplayEditorModule, CustomGameplayEditor); void FCustomGameplayEditorModule::StartupModule() { } void FCustomGameplayEditorModule::ShutdownModule() { }이는
CustomGameplayEditorModule.h의 함수를 구현합니다.
IMPLEMENT_GAME_MODULE 에 대한 두 번째 필드에 제공하는 이름은 유효해야 하며, 그렇지 않으면 프로젝트가 런타임 시 쿠킹된 데이터와 충돌을 일으키는데, 이는 디버깅하기 어렵습니다. 이름이 모듈의 폴더 이름과 일치하는지 확인하세요.
프로젝트에 모듈 등록하기
이제 두 모듈이 모두 구현되었으니 프로젝트에 두 모듈을 추가해야 합니다.
-
텍스트 에디터에서
.uproject파일을 엽니다. "Modules" 섹션에 새 항목을 추가합니다. -
런타임 모듈을 등록하려면 다음 내용을 추가합니다.
.uproject file
{ "Name": "CustomGameplay", "Type": "Runtime", "LoadingPhase": "Default" },- 에디터 모듈을 등록하려면 다음 내용을 추가합니다.
.uproject file
{ "Name": "CustomGameplayEditor", "Type": "Editor", "LoadingPhase": "Default" }Type 으로 Editor 를 사용하면 에디터 모듈임을 나타냅니다. 따라서 프로젝트의 런타임 빌드를 생성할 때 컴파일되지 않습니다.
-
프로젝트의
Target.cs파일을 엽니다.ExtraModuleNames에 "CustomGameplay" 를 추가합니다.Target.cs
ExtraModuleNames.Add("CustomGameplay"); -
프로젝트의 Editor.Target.cs 파일을 엽니다. ExtraModuleNames에 "CustomGameplayEditor" 및 "CustomGameplay" 를 추가합니다.
Editor.Target.cs
ExtraModuleNames.AddRange(new string[]("CustomGameplayEditor", "CustomGameplay")); -
프로젝트의 Build.cs 파일을 엽니다. PublicDependencyModuleNames.AddRange에 "CustomGameplay"에 대한 항목을 추가합니다.
Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "CustomGameplay" }); -
편집한 모든 파일을 저장한 다음, .uproject를 우클릭하고 프로젝트 파일을 재생성합니다.
-
프로젝트 코드를 빌드합니다.
최종 결과
IDE에서 프로젝트를 확인하면 이제 솔루션 파일에 기본 애플리케이션 모듈과 함께 두 개의 새 모듈이 모두 표시됩니다. 또한, 프로젝트를 컴파일할 때 새로운 C++ 클래스 마법사의 모듈 드롭다운에 두 모듈이 표시됩니다.