.Build.cs 파일을 가지고 있어서 어떤 라이브러리에 의존하는지, 어떤 방식으로 로드되는지 정의{프로젝트명}.Target.cs : 실행 파일 빌드 설정 파일{프로젝트명}Editor.Target.cs : 에디터 빌드 설정 파일{모듈명}.Build.cs : 엔진에 있는 다른 모듈을 사용하기 위해 모듈들을 추가한 파일
// Test.Build.cs
using UnrealBuildTool;
public class Test : ModuleRules
{
public Test(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
// 해당 모듈을 헤더 파일과 cpp 파일 모두에서 사용 가능
PublicDependencyModuleNames.AddRange(new string[]
{
// Initial Modules
"Core", "CoreUObject", "Engine", "InputCore",
}
);
// 해당 모듈은 cpp 파일에서만 사용 가능
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
// Test.cpp
#include "Test.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_MODULE( FDefaultModuleImpl, Test );
IMPLEMENT_PRIMARY_GAME_MODULE() : 주 게임 모듈IMPLEMENT_GAME_MODULE() : 게임 모듈IMPLEMENT_MODULE() : 일반 모듈{프로젝트명}.Target.cs, {프로젝트명}Editor.Target.cs// ModuleAndPlugin.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class ModuleAndPluginTarget : TargetRules
{
public ModuleAndPluginTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V5;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5;
ExtraModuleNames.Add("ModuleAndPlugin");
ExtraModuleNames.Add("Test");
}
}
// ModuleAndPluginEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class ModuleAndPluginEditorTarget : TargetRules
{
public ModuleAndPluginEditorTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V5;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5;
ExtraModuleNames.Add("ModuleAndPlugin");
ExtraModuleNames.Add("Test");
}
}
{프로젝트명}.uproject -> 모듈에 추가로 설정// ModuleAndPlugin.uproject
{
...
"Modules": [
{
"Name": "Test",
"Type": "Runtime",
"LoadingPhase": "PreDefault",
"AdditionalDependencies": [
"Engine"
]
},
{
"Name": "ModuleAndPlugin",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine",
"Test"
]
}
],
"Plugins": [
...
]
}


{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "Temporary",
"Description": "",
"Category": "Other",
"CreatedBy": "",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false,
"Modules": [
{
"Name": "Temporary",
"Type": "Runtime",
"LoadingPhase": "Default"
}
]
}
// Temporary.Build.cs
using UnrealBuildTool;
public class Temporary : ModuleRules
{
public Temporary(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject", "Engine", "Slate", "SlateCore",
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
// Temporary.h
#pragma once
#include "Modules/ModuleManager.h"
class FTemporaryModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
// Temporary.cpp
#include "Temporary.h"
#define LOCTEXT_NAMESPACE "FTemporaryModule"
void FTemporaryModule::StartupModule()
{
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
}
void FTemporaryModule::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FTemporaryModule, Temporary)
{프로젝트명}.Target.cs, {프로젝트명}Editor.Target.cs// ModuleAndPlugin.Target.cs
public class ModuleAndPluginTarget : TargetRules
{
public ModuleAndPluginTarget(TargetInfo Target) : base(Target)
{
...
ExtraModuleNames.Add("Temporary");
}
}
// ModuleAndPluginEditor.Target.cs
public class ModuleAndPluginEditorTarget : TargetRules
{
public ModuleAndPluginEditorTarget(TargetInfo Target) : base(Target)
{
...
ExtraModuleNames.Add("Temporary");
}
}
{프로젝트명}.uproject -> 플러그인에 등록 및 기존 프로젝트에 모듈 의존성 등록// ModuleAndPlugin.uproject
{
...,
"Modules": [
...,
{
"Name": "ModuleAndPlugin",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
...,
"Temporary"
]
}
],
"Plugins": [
{
...
},
{
"Name": "Temporary",
"Enabled": true
}
]
}

플러그인은 웬만하면 에디터를 통해서 만들도록 하자!!