MCPInstall

ue-module-build-system

Use when writing or fixing Build.cs, Target.cs, .uproject or .uplugin files, creating a module or plugin, or resolving an Unreal build error. Also use when the user mentions 'unresolved external symbol', 'LNK2019', 'cannot open include file', 'C1083', 'MODULENAMEAPI', 'PublicDependencyModuleNames', 'IWYU', 'PCHUsage', 'IMPLEMENTMODULE', 'IMPLEMENTPRIMARYGAMEMODULE', 'LoadingPhase', 'circular dependency', 'Missing precompiled manifest', 'EngineAssociation', 'IncludeOrderVersion', 'Live Coding'. For UCLASS/UPROPERTY rules see ue-cpp-foundations; for editor modules see ue-editor-tools; for Game Feature plugins see ue-game-features.

Installs
1.3K
Last 24h
+14
Trending rank
#7137
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/quodsoler/unreal-engine-skills --skill ue-module-build-system
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads ue-module-build-system automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

UE Module & Build System

Target engine: UE 5.8. APIs below are verified against the 5.8 headers and UnrealBuildTool sources; older forms are listed under "Deprecated — do not use".

This skill covers UnrealBuildTool (UBT) ModuleRules (*.Build.cs) and TargetRules (*.Target.cs), the .uproject and .uplugin descriptors, module registration (IModuleInterface and IMPLEMENT_MODULE in Modules/ModuleManager.h, module Core), plugin discovery (IPluginManager in Interfaces/IPluginManager.h, module Projects), and the compiler, linker, UHT and UBT errors those files cause.

Context

Read .agents/ue-project-context.md if it exists (module names, conventions, enabled plugins, GAS/networking setup). Do not stop if it is missing.

Identify the area from the request and the codebase. Ask only when two plausible readings would produce different code.

Request is about…Go to
Dependencies, include paths, PCH, warnings in an existing Build.csBuild.cs Anatomy
Target.cs, BuildSettingsVersion, IncludeOrderVersion, target typesTarget.cs
.uproject, module Type, LoadingPhase, enabling plugins.uproject File
Adding a module (IMPLEMENT_MODULE, module interface, StartupModule)Creating a New Module
Adding a plugin (.uplugin, runtime + editor modules, dependencies)Creating a Plugin
"Which module do I add to use type X?"Which Module Provides This Type
LNK2019, C1083, UHT, UBT or runtime module-load errorsResolving Build Errors

Build.cs Anatomy

Every module has <ModuleName>.Build.cs next to its Public/ and Private/ folders. The class name must equal the module name.

// Source/MyGame/MyGame.Build.cs
using UnrealBuildTool;

public class MyGame : ModuleRules
{
    public MyGame(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        // Types from these modules appear in this module's Public/ headers
        PublicDependencyModuleNames.AddRange(new string[]
        {
            "Core",
            "CoreUObject",
            "Engine",
            "InputCore",
            "EnhancedInput",
        });

        // Used only inside Private/ .cpp files; not re-exported downstream
        PrivateDependencyModuleNames.AddRange(new string[]
        {
            "Slate",
            "SlateCore",
            "UMG",
        });

        // Loaded through FModuleManager at runtime, never linked
        DynamicallyLoadedModuleNames.Add("OnlineSubsystem");
    }
}

Public vs Private Dependencies

FieldUse when
PublicDependencyModuleNamesA type from the module appears in one of your Public/ headers (base class, member, parameter, return type, UPROPERTY). Downstream modules inherit the include paths.
PrivateDependencyModuleNamesThe module is used only in Private/ .cpp files or private headers.
PublicIncludePathModuleNames / PrivateIncludePathModuleNamesYou need the module's headers (forward declarations, inline types) but link nothing from it.
DynamicallyLoadedModuleNamesYou call FModuleManager::Get().LoadModule(...) yourself; UBT only ensures the module is built.

Start private and promote to public only when a public header forces it. Everything-public inflates compile time for every downstream module.

Include Paths and IWYU

UBT discovers Public/, Internal/ and Private/ automatically; PublicIncludePaths/PrivateIncludePaths exist for extra subfolders only. Under BuildSettingsVersion.V2 and later, bLegacyPublicIncludePaths is false, so headers from other modules are written relative to that module's Public/ (or Classes/) root:

// Source/MyGame/Private/MyActor.cpp
#include "MyActor.h"                          // own header first
#include "GameFramework/Actor.h"              // Engine/Classes/GameFramework/Actor.h
#include "Engine/World.h"                     // only what this file uses directly
#include "GameFramework/PlayerController.h"

IWYUSupport defaults to IWYUSupport.Full, which lets UnrealBuildTool -Mode=IWYU rewrite the module's includes; set IWYUSupport = IWYUSupport.KeepAsIs for code you maintain by hand.

API Export Macro

UBT defines <MODULENAME>_API (module name upper-cased plus _API) as DLLEXPORT while compiling the module and DLLIMPORT for importers; monolithic builds define it empty. Anything referenced from another module needs it:

// Source/MyGame/Public/MyGameTypes.h
#pragma once
#include "CoreMinimal.h"

class MYGAME_API FMyGameTypes
{
public:
    void DoSomething();
};

MYGAME_API void MyGameFreeFunction();

Engine headers wrap this as #define UE_API CORE_API at the top of a file and #undef UE_API at the bottom (Async/Mutex.h). That is an engine-only convention; project code writes MYGAME_API directly. Missing MYGAME_API on a class another module references is the most common cause of LNK2019.

Warnings and Compiler Flags

bWarningsAsErrors = true;
CppCompileWarningSettings.ShadowVariableWarningLevel = WarningLevel.Error;   // MSVC C4456/C4458/C4459
CppCompileWarningSettings.UnsafeTypeCastWarningLevel = WarningLevel.Warning; // MSVC C4244/C4838
CppCompileWarningSettings.DeprecationWarningLevel = WarningLevel.Error;      // MSVC C4996 from UE_DEPRECATED

bEnableExceptions = false;               // default; enable only for third-party code that throws
bUseRTTI = false;                        // default; enable only for third-party dynamic_cast/typeid
CppStandard = CppStandardVersion.Cpp20;  // per-module override; the engine default is Cpp20
bUseUnity = false;                       // opt this module out of unity builds

// Engine-bundled third-party libraries (Engine/Source/ThirdParty/<Name>/<Name>.Build.cs)
AddEngineThirdPartyPrivateStaticDependencies(Target, "zlib", "OpenSSL", "libcurl");

Every ModuleRules field, the RuntimeDependencies API, platform conditionals and the full engine module table are in references/build-cs-reference.md.

Target.cs

Source/MyGame.Target.cs and Source/MyGameEditor.Target.cs. The class must be named <FileName>Target; UBT otherwise fails with "Expecting to find a type to be declared in a target rules named 'MyGameTarget'".

// Source/MyGame.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;

public class MyGameTarget : TargetRules
{
    public MyGameTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;
        DefaultBuildSettings = BuildSettingsVersion.V7;
        IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_8;
        ExtraModuleNames.Add("MyGame");
    }
}

Source/MyGameEditor.Target.cs declares MyGameEditorTarget with the same body except Type = TargetType.Editor; and ExtraModuleNames.AddRange(new string[] { "MyGame", "MyGameEditor" });.

  • BuildSettingsVersion.V7 is what 5.8 project templates emit (Latest also equals V7). Pin the explicit value; Latest changes meaning on every engine upgrade.
  • EngineIncludeOrderVersion.Unreal5_8 selects the UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_8 define that keeps removed implicit engine includes available to your code. Unreal5_1–Unreal5_5 are [Obsolete] and unsupported; Unreal5_6 is deprecated. A module may override with ModuleRules.IncludeOrderVersion.
BuildSettingsVersionDefaults it turns on
V2PCHUsage = UseExplicitOrSharedPCHs, bLegacyPublicIncludePaths = false
V3bLegacyParentIncludePaths = false
V4CppStandard default becomes Cpp20, WindowsPlatform.bStrictConformanceMode = true
V5bValidateFormatStrings = true
V6WindowsPlatform.bStrictInlineConformance = true, UndefinedIdentifierWarningLevel = Error
V7 (= Latest)ReturnTypeWarningLevel, DanglingWarningLevel, UnreachableCodeWarningLevel = Error
TargetTypeBuilds
GameStandalone game executable
EditorEditor build; includes Editor-type modules
ClientNetworked client without server-only code
ServerDedicated server, no renderer
ProgramStandalone tool (needs bCompileAgainstEngine/bCompileAgainstCoreUObject choices)

Build configurations (UnrealTargetConfiguration): Debug, DebugGame (engine optimized, game unoptimized), Development (default), Test, Shipping. Useful target switches: bUseUnityBuild, bUseLoggingInShipping, bUseChecksInShipping, bWithLiveCoding, LinkType = TargetLinkType.Monolithic, GlobalDefinitions/ProjectDefinitions, and bOverrideBuildEnvironment = true to "ignore violations to the shared build environment (eg. editor targets modifying definitions)".

.uproject File

{
    "FileVersion": 3,
    "EngineAssociation": "5.8",
    "Category": "",
    "Description": "",
    "Modules": [
        {
            "Name": "MyGame",
            "Type": "Runtime",
            "LoadingPhase": "Default",
            "AdditionalDependencies": [ "Engine", "AIModule", "UMG" ]
        },
        { "Name": "MyGameEditor", "Type": "Editor", "LoadingPhase": "Default" }
    ],
    "Plugins": [
        { "Name": "ModelingToolsEditorMode", "Enabled": true, "TargetAllowList": [ "Editor" ] },
        { "Name": "StateTree", "Enabled": true },
        { "Name": "MyPlugin", "Enabled": true, "Optional": true }
    ]
}

AdditionalDependencies is the descriptor's "list of additional dependencies for building this module". Plugin references accept Name, Enabled, Optional, TargetAllowList/TargetDenyList, PlatformAllowList/PlatformDenyList, TargetConfigurationAllowList.

Module Types (ModuleHostType)

TypeLoaded by
RuntimeAny target using the UE runtime (the default for game code)
RuntimeNoCommandletAny target except commandlets
RuntimeAndProgramAny target or program
CookedOnly / UncookedOnlyCooked builds only / uncooked (editor, PIE) builds only — UncookedOnly is the type for Blueprint node (K2Node) modules
DeveloperOnly when developer-tool support is enabled (deprecated: use DeveloperTool)
DeveloperToolAny target where bBuildDeveloperTools is enabled
Editor / EditorNoCommandletEditor only / editor but not commandlets
EditorAndProgramEditor or program targets
ProgramProgram targets only
ServerOnly / ClientOnly / ClientOnlyNoCommandletServers only / clients, commandlets and editor / clients and editor
ExternalNever loaded automatically; reference only

Loading Phases (ModuleLoadingPhase)

LoadingPhaseWhen
EarliestPossibleAs soon as plugins can load (GConfig exists)
PostConfigInitRight after the config system; very low-level hooks only
PostSplashScreenFirst screen after the system splash
PreEarlyLoadingScreenAfter PostConfigInit, before CoreUObject initializes
PreLoadingScreenBefore the loading screen triggers
PreDefaultRight before Default — asset types, custom classes other modules need
DefaultDuring engine init, after game modules load (most modules)
PostDefaultRight after Default
PostEngineInitAfter the engine is fully initialized
NoneNever auto-loaded; use FModuleManager::Get().LoadModule()

Creating a New Module

Source/
  MyModule/
    MyModule.Build.cs
    Public/
      IMyModule.h           (public module interface, optional)
      MyModuleTypes.h
    Private/
      MyModule.cpp          (IMPLEMENT_MODULE lives here)
      MyModuleTypes.cpp
// Source/MyModule/Public/IMyModule.h
#pragma once
#include "Modules/ModuleManager.h"

class IMyModule : public IModuleInterface
{
public:
    static IMyModule& Get()
    {
        return FModuleManager::LoadModuleChecked<IMyModule>("MyModule");
    }

    static bool IsAvailable()
    {
        return FModuleManager::Get().IsModuleLoaded("MyModule");
    }
};
// Source/MyModule/Private/MyModule.cpp
#include "IMyModule.h"

class FMyModule : public IMyModule
{
public:
    virtual void StartupModule() override
    {
        // Load dependent modules, register settings, delegates, asset types
    }

    virtual void ShutdownModule() override
    {
        // Unregister in reverse order; dependencies loaded in StartupModule are still alive
    }
};

IMPLEMENT_MODULE(FMyModule, MyModule)
Macro (Modules/ModuleManager.h)Use
IMPLEMENT_MODULE(FMyModule, MyModule)Modules without gameplay classes (tools, editor, libraries)
IMPLEMENT_GAME_MODULE(FMyModule, MyModule)Modules that contain gameplay UCLASSes; expands to IMPLEMENT_MODULE
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, MyGame, "MyGame")Exactly one per game; in monolithic builds it defines the project name from UE_PROJECT_NAME; the third argument is DEPRECATED_GameName (ModuleManager.h:1100) and unused

FDefaultModuleImpl and FDefaultGameModuleImpl are ready-made classes for modules with no startup logic; FDefaultGameModuleImpl::IsGameModule() returns true so hot-reload tooling treats it as game code. The second macro argument must equal the Build.cs module name; both the monolithic and modular forms of the macro check it against UE_MODULE_NAME with UE_STATIC_ASSERT_WARN (ModuleManager.h:950, :968), which emits a "Module name mismatch" deprecation-style warning, an error only under bWarningsAsErrors. Other IModuleInterface hooks: PreUnloadCallback(), PostLoadCallback(), SupportsDynamicReloading(), SupportsAutomaticShutdown().

Then register the module in three places: the .uproject (or .uplugin) Modules array, ExtraModuleNames in every Target.cs that should build it, and the dependency lists of modules that use it. Editor-only modules ("Type": "Editor", PrivateDependencyModuleNames.Add("UnrealEd") inside if (Target.bBuildEditor)) are covered in ue-editor-tools.

Creating a Plugin

Plugins/
  MyPlugin/
    MyPlugin.uplugin
    Resources/Icon128.png
    Content/                    (only when CanContainContent is true)
    Source/
      MyPlugin/
        MyPlugin.Build.cs
        Public/  Private/MyPluginModule.cpp
      MyPluginEditor/
        MyPluginEditor.Build.cs
        Public/  Private/MyPluginEditorModule.cpp
{
    "FileVersion": 3,
    "Version": 1,
    "VersionName": "1.0",
    "FriendlyName": "My Plugin",
    "Description": "Does something useful.",
    "Category": "Gameplay",
    "CreatedBy": "MyStudio",
    "CreatedByURL": "",
    "DocsURL": "",
    "MarketplaceURL": "",
    "SupportURL": "",
    "EnabledByDefault": false,
    "CanContainContent": true,
    "IsBetaVersion": false,
    "IsExperimentalVersion": false,
    "Installed": false,
    "Modules": [
        { "Name": "MyPlugin", "Type": "Runtime", "LoadingPhase": "PreDefault" },
        { "Name": "MyPluginEditor", "Type": "Editor", "LoadingPhase": "Default", "PlatformAllowList": [ "Win64", "Mac", "Linux" ] }
    ],
    "Plugins": [
        { "Name": "GameplayAbilities", "Enabled": true },
        { "Name": "StateTree", "Enabled": true, "Optional": true }
    ]
}
  • Declare every plugin whose modules you depend on in Plugins; UBT warns "Plugin 'MyPlugin' does not list plugin 'X' as a dependency, but module 'MyPlugin' depends on module 'Y'" otherwise.
  • IsExperimentalVersion / IsBetaVersion are what the editor shows as maturity; EnabledByDefault: true enables the plugin in every project without a .uproject entry.
  • Content-only plugins omit Modules entirely and keep "CanContainContent": true.
  • Game Feature plugins (UGameFeatureData, actions) are owned by ue-game-features.
// Plugins/MyPlugin/Source/MyPlugin/MyPlugin.Build.cs — runtime module
using UnrealBuildTool;

public class MyPlugin : ModuleRules
{
    public MyPlugin(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "GameplayAbilities" });
    }
}
// Plugins/MyPlugin/Source/MyPluginEditor/MyPluginEditor.Build.cs — editor module
using UnrealBuildTool;

public class MyPluginEditor : ModuleRules
{
    public MyPluginEditor(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" });
        PrivateDependencyModuleNames.AddRange(new string[] { "MyPlugin", "UnrealEd", "ToolMenus", "PropertyEditor" });
    }
}

The runtime module never includes editor headers; gate editor code with #if WITH_EDITOR and editor dependencies with if (Target.bBuildEditor).

Engine vs project plugins: Engine/Plugins/ is shared by every project on that install; <Project>/Plugins/ travels with the project and wins on a name clash. Installed (Launcher) engines ship only precompiled engine modules: depending on an engine module that was not precompiled fails with "Missing precompiled manifest for 'X'. This module can not be referenced in a monolithic precompiled build, remove this reference or migrate to a fully compiled source build."

Which Module Provides This Type

Add to *DependencyModuleNamesForPlugin to enable
CoreFString, TArray, FName, UE_LOG, FModuleManager—
CoreUObjectUObject, UClass, FInstancedStruct, reflection—
EngineAActor, UActorComponent, UWorld, UGameInstance, UAudioComponent—
InputCoreFKey, EKeys—
EnhancedInputUInputAction, UInputMappingContext, UEnhancedInputComponentEnhancedInput
GameplayTagsFGameplayTag, FGameplayTagContainer, UGameplayTagsManager—
GameplayTasksUGameplayTask, UGameplayTasksComponent—
GameplayAbilitiesUAbilitySystemComponent, UGameplayAbility, UGameplayEffectGameplayAbilities
NetCoreFFastArraySerializer, push-model macros—
DeveloperSettingsUDeveloperSettings—
Slate, SlateCoreSWidget, SCompoundWidget / FSlateBrush, FSlateColor—
UMGUUserWidget, UButton, UTextBlock—
CommonUI, CommonInputUCommonActivatableWidget, UCommonButtonBaseCommonUI
ModelViewViewModelUMVVMViewModelBase, UMVVMViewModelViewViewModel (Beta in 5.8)
AIModule, NavigationSystemAAIController, UBehaviorTree / UNavigationSystemV1—
StateTreeModule, GameplayStateTreeModuleUStateTree, FStateTreeTaskBase / UStateTreeComponentStateTree, GameplayStateTree
MassEntity, MassCore, MassSignalsFMassEntityManager, UMassProcessor / FTransformFragment / UMassSignalSubsystem— (core modules)
NiagaraUNiagaraComponent, UNiagaraSystem, UNiagaraFunctionLibraryNiagara
PCGUPCGComponent, UPCGGraph, UPCGSettingsPCG
MoverUMoverComponent, UCharacterMoverComponentMover (Experimental in 5.8)
GameplayCamerasUGameplayCameraComponent, UCameraAssetGameplayCameras (Experimental in 5.8)
LevelSequence, MovieSceneULevelSequence, ULevelSequencePlayer / UMovieScene—
PhysicsCore, ChaosUPhysicalMaterial / Chaos solver types—
ProceduralMeshComponentUProceduralMeshComponentProceduralMeshComponent
GeometryScriptingCore, GeometryFrameworkUGeometryScriptLibrary_MeshPrimitiveFunctions / UDynamicMeshGeometryScripting
AudioExtensionsIAudioParameterControllerInterface, FAudioParameter—

The full table, including editor and networking modules, is in references/build-cs-reference.md.

Resolving Build Errors

Error textFirst thing to check
LNK2019 unresolved external symbol / LNK2001Module missing from *DependencyModuleNames, or missing MYGAME_API on the referenced class
C1083: Cannot open include fileModule missing from dependencies, or include not written relative to the module's Public/ root
#include found after .generated.h fileMove #include "MyClass.generated.h" to be the last include
Expected a GENERATED_BODY() at the start of the classAdd GENERATED_BODY() as the first line inside the UCLASS/USTRUCT body
Could not find definition for module 'X'No X.Build.cs found, or wrong module name in .uproject/ExtraModuleNames
Circular dependency for 'X.Build.cs' detectedExtract a shared module or switch one side to DynamicallyLoadedModuleNames
Missing precompiled manifest for 'X'Installed engine cannot compile that engine module; remove the dependency or use a source build
Plugin 'X' failed to load because module 'Y' could not be foundRebuild the plugin; module not compiled for this target
Module 'X' not found - its StaticallyLinkedModuleInitializers function is nullMonolithic build did not link the module; add it to ExtraModuleNames or a .uplugin

Full messages, causes, MSVC warning-level mapping, Live Coding limits and cooking failures are in references/common-build-errors.md.

Deprecated — do not use

Do not emitUse in 5.8Source
bEnforceIWYU = trueIWYUSupport = IWYUSupport.Full (already the default)[Obsolete("Deprecated in UE5.2 - Use IWYUSupport instead.")] in Configuration/Rules/ModuleRules.Obsolete.cs
bUseAVX = trueMinCpuArchX64 = MinimumCpuArchitectureX64.AVX2[Obsolete("bUseAVX is obsolete ... replace with MinCpuArchX64")] in ModuleRules.Obsolete.cs
ShadowVariableWarningLevel = WarningLevel.Error on ModuleRules/TargetRulesCppCompileWarningSettings.ShadowVariableWarningLevel[Obsolete("Deprecated in UE5.6 ...")] in ModuleRules.Obsolete.cs, TargetRules.Obsolete.cs
UnsafeTypeCastWarningLevel = ... directlyCppCompileWarningSettings.UnsafeTypeCastWarningLevel[Obsolete("Deprecated in UE5.6 ...")] in ModuleRules.Obsolete.cs, TargetRules.Obsolete.cs
bEnableUndefinedIdentifierWarnings / bUndefinedIdentifierErrorsCppCompileWarningSettings.UndefinedIdentifierWarningLevelTwo steps: 5.5 moved them to UndefinedIdentifierWarningLevel on the rules class, 5.6 moved that under CppCompileWarningSettings. [Obsolete(...)] in ModuleRules.Obsolete.cs, TargetRules.Obsolete.cs
DeprecationWarningLevel = ... on TargetRulesCppCompileWarningSettings.DeprecationWarningLevel[Obsolete("Deprecated in UE5.6 ...")] in TargetRules.Obsolete.cs
bUsesSteam = trueRemove; the flag does nothing[Obsolete("Deprecated in UE5.5 - No longer used in engine.")] in TargetRules.Obsolete.cs
bCompileChaos, bUseChaos, bCompilePhysX, bCompileAPEX, bCompileNvClothRemove; Chaos is always enabled[Obsolete("Deprecated in UE5.1 ...")] in TargetRules.Obsolete.cs
bDisableDebugInfo = trueDebugInfo = DebugInfoMode.None[Obsolete("Deprecated in UE5.4 - Replace with TargetRules.DebugInfo")] in TargetRules.Obsolete.cs
bUseFastPDBLinking = trueRemove[Obsolete("Deprecated in UE5.7 - No longer recommended")] in TargetRules.Obsolete.cs
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1 … Unreal5_5EngineIncludeOrderVersion.Unreal5_8[Obsolete("The Unreal 5.5 include order is unsupported.")] in Configuration/Rules/TargetRules.cs
EngineIncludeOrderVersion.Unreal5_6Unreal5_8[Obsolete("... deprecated and will be unsupported in 5.9.")] in TargetRules.cs
"WhitelistPlatforms", "BlacklistPlatforms", "WhitelistTargets" in descriptors"PlatformAllowList", "PlatformDenyList", "TargetAllowList"deprecated-fallback readers in Configuration/Descriptors/ModuleDescriptor.cs
"Type": "Developer""Type": "DeveloperTool""The 'Developer' module type has been deprecated in 4.24" in ModuleDescriptor.cs
EngineIncludeOrderVersion.Latest, BuildSettingsVersion.Latest in a shipped projectPin Unreal5_8 / V7UBT doc: "Using Latest comes with a high risk of introducing compile errors" (TargetRules.cs)

Common Mistakes

Everything in PublicDependencyModuleNames: every downstream module inherits the include paths and recompiles more often. Keep a dependency private until one of your Public/ headers needs it.

Missing MYGAME_API: the class compiles inside its own module and fails with LNK2019 from any other module. Add the macro to the class or free-function declaration, not the definition.

IMPLEMENT_MODULE name mismatch: IMPLEMENT_MODULE(FMyModule, MyGameplay) in a module whose Build.cs is MyModule emits the "Module name mismatch" warning (UE_STATIC_ASSERT_WARN, not a hard error) and, separately, fails to load in monolithic builds because the linker looks for IMPLEMENT_MODULE_MyModule. The second argument is the module name, not the class.

Editor code in a runtime module: #include "Editor.h" or UnrealEd in PublicDependencyModuleNames breaks Game, Client and Server targets. Wrap with #if WITH_EDITOR and if (Target.bBuildEditor), or move the code to an Editor-type module.

Module registered in one place only: a module must appear in .uproject/.uplugin Modules and in ExtraModuleNames of each Target.cs; missing either gives "Could not find definition for module" or a module that never loads.

Wrong LoadingPhase for registration: asset types, custom UClass registrations and console variables that other modules read at Default must load at PreDefault.

Plugin dependency not declared: a .uplugin module depending on another plugin's module without a Plugins entry produces the UBT dependency warning and breaks when the other plugin is disabled.

Relying on transitive includes: a header that compiled because Engine/World.h happened to pull it in breaks when that engine header trims its includes under a newer IncludeOrderVersion. Include what you use.

Wrong header path: including Actor.h or Engine/Actor.h fails with C1083; the file is GameFramework/Actor.h under Engine/Classes.

Related Skills

  • ue-cpp-foundations — UCLASS/UPROPERTY/UFUNCTION specifiers, GENERATED_BODY, what UHT needs in public headers
  • ue-editor-tools — editor-only modules, UnrealEd/ToolMenus/PropertyEditor dependencies, UEditorSubsystem
  • ue-testing-debugging — UE_LOG categories and bUseLoggingInShipping, automation test modules and targets
  • ue-game-features — Game Feature plugins, UGameFeatureData, UGameFeatureAction, Modular Gameplay
  • ue-project-context — the .agents/ue-project-context.md file that records module names, targets and enabled plugins
  • ue-data-assets-tables — UDataAsset, UDataTable, soft references, Asset Manager and async loading

FAQ

What does the ue-module-build-system skill do?

Use when writing or fixing Build.cs, Target.cs, .uproject or .uplugin files, creating a module or plugin, or resolving an Unreal build error. Also use when the user mentions 'unresolved external symbol', 'LNK2019', 'cannot open include file', 'C1083', 'MODULENAMEAPI', 'PublicDependencyModuleNames', 'IWYU', 'PCHUsage', 'IMPLEMENTMODULE', 'IMPLEMENTPRIMARYGAMEMODULE', 'LoadingPhase', 'circular dependency', 'Missing precompiled manifest', 'EngineAssociation', 'IncludeOrderVersion', 'Live Coding'. For UCLASS/UPROPERTY rules see ue-cpp-foundations; for editor modules see ue-editor-tools; for Game Feature plugins see ue-game-features.

How do I install ue-module-build-system?

Run npx skills add https://github.com/quodsoler/unreal-engine-skills --skill ue-module-build-system in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/ue-module-build-system/ (personal) or .claude/skills/ue-module-build-system/ (project).

Which AI agents can use ue-module-build-system?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is ue-module-build-system safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains ue-module-build-system?

It is published by quodsoler in quodsoler/unreal-engine-skills. It has 1,263 recorded installs.

More from quodsoler/unreal-engine-skills

View all →

ue-cpp-foundations

quodsoler/unreal-engine-skills

Use when writing Unreal Engine C++ that touches the reflection system or core types: UCLASS, UPROPERTY, UFUNCTION, USTRUCT, UENUM, GENERATEDBODY, TObjectPtr, TWeakObjectPtr, TSharedPtr, FGCObject, TArray, TMap, TSet, TOptional, TVariant, DECLAREDYNAMICMULTICASTDELEGATE, AddDynamic, FName, FString, FText, UGameInstanceSubsystem, UWorldSubsystem, GetDefault, TNotNull. Also use when the user mentions 'UE C++', 'garbage collection', 'CDO', 'smart pointers' or 'specifiers'. For Actor and component lifecycle, see ue-actor-component-architecture; for Build.cs and modules, see ue-module-build-system; for Blueprint-facing functions and latent actions, see ue-blueprint-cpp-interop.

Frontend & Design1.4K installs

ue-ui-umg-slate

quodsoler/unreal-engine-skills

Use when writing or fixing Unreal Engine UI in C++ — UMG user widgets, Slate widgets, Common UI screens, or MVVM view models. Also use when the user mentions 'UUserWidget', 'NativeConstruct', 'BindWidget', 'CreateWidget', 'AddToViewport', 'ESlateVisibility', 'OnClicked', 'UListView', 'widget animation', 'SNew', 'SLATEBEGINARGS', 'SCompoundWidget', 'UCommonActivatableWidget', 'activatable widget stack', 'UCommonButtonBase', 'gamepad focus', 'FUIInputConfig', 'UMVVMViewModelBase', 'FieldNotify', or 'WidgetComponent'. For input modes and Enhanced Input, see ue-input-system; for Slate in editor tooling, see ue-editor-tools.

Frontend & Design1.4K installs

ue-editor-tools

quodsoler/unreal-engine-skills

Use when extending the Unreal Editor from C++ with detail customizations, editor utility widgets, menus, editor modes, asset definitions or editor subsystems. Also use when the user mentions 'IDetailCustomization', 'IPropertyTypeCustomization', 'CustomizeDetails', 'RegisterCustomClassLayout', 'IDetailLayoutBuilder', 'AddCustomRow', 'IPropertyHandle', 'UToolMenus', 'ExtendMenu', 'FToolMenuEntry', 'UEditorUtilityWidget', 'Blutility', 'UAssetActionUtility', 'UEditorSubsystem', 'UEdMode', 'UAssetDefinition', 'UFactory', 'FScopedTransaction', or 'editor module'. For Slate fundamentals, see ue-ui-umg-slate; for Build.cs wiring, see ue-module-build-system.

Frontend & Design1.3K installs

ue-project-context

quodsoler/unreal-engine-skills

Use when creating, refreshing or repairing .agents/ue-project-context.md, the project document every other UE skill reads first. Also use when the user says 'project context', 'set up context', 'UE context', 'scan my project', 'onboard the agent to my project', 'update project context', 'configure project', 'what engine version is this project on', 'which plugins do we have enabled', or complains that UE advice keeps coming out generic. For Build.cs and Target.cs mechanics, see ue-module-build-system; for naming and API-macro conventions, see ue-cpp-foundations; for GAS specifics, see ue-gameplay-abilities.

Backend & APIs1.3K installs

ue-testing-debugging

quodsoler/unreal-engine-skills

Use when writing or running Unreal Engine tests, adding logging, or profiling a build. Also use when the user mentions 'UELOG', 'log category', 'DEFINELOGCATEGORY', 'UELOGFMT', 'verbosity', 'check', 'ensure', 'ensureMsgf', 'verify', 'IMPLEMENTSIMPLEAUTOMATIONTEST', 'automation test', 'TESTCLASS', 'CQTest', 'AFunctionalTest', 'latent command', 'Unreal Insights', 'TRACECPUPROFILEREVENTSCOPE', 'TRACEBOOKMARK', 'stat unit', 'SCOPECYCLECOUNTER', 'memreport', 'DrawDebugLine', 'UEVLOG', 'gameplay debugger', 'ShowDebug', 'console command', 'CVar', or 'why is my frame time bad'. For module and target wiring, see ue-module-build-system; for editor tooling, see ue-editor-tools.

Testing & QA1.3K installs

ue-materials-rendering

quodsoler/unreal-engine-skills

Use when writing C++ for materials or rendering — dynamic material instances, material parameter collections, render targets, scene capture, post process, decals, Nanite, Lumen, MegaLights, Substrate. Also use when the user mentions 'MID', 'CreateDynamicMaterialInstance', 'SetScalarParameterValue', 'UMaterialInstanceDynamic', 'material parameter collection', 'UTextureRenderTarget2D', 'DrawMaterialToRenderTarget', 'scene capture', 'post process volume', 'FPostProcessSettings', 'bOverride', 'blendable', 'decal', 'custom depth stencil', 'Nanite', 'Lumen' or 'global shader'. For Niagara materials, see ue-niagara-effects; for UMG materials, see ue-ui-umg-slate.

Frontend & Design1.3K installs

Popular media & creative skills

View category →

hyperframes

heygen-com/hyperframes

Read first to make, edit, animate or render any video with HyperFrames (HTML rendered to video), including launch films, explainers, music videos, charts, maps, vertical clips, title cards, captions and overlays. Holds the render contract, the work loop and what each kind of video needs.

Media & Creative1.2M installs

media-use

heygen-com/hyperframes

Get or make any media for a HyperFrames video - music, sound effects, images, icons, logos, voiceover, avatar and generated video, transcripts, cutouts, colour grades and looks - with HeyGen or free local tools, and mix placed audio. Also for footage that looks dark, flat or dull, or should be stylized or hidden.

Media & Creative1.1M installs

hyperframes-registry

heygen-com/hyperframes

About 450 ready-made HyperFrames blocks and components installed as editable source - transitions, overlays, titles, kinetic type, captions, charts, map overlays, 3D, camera moves. Use it before hand-building any named visual (CRT scanlines, glitch, film grain, a chart); also for hyperframes add and catalog.

Media & Creative1M installs

hyperframes-creative

heygen-com/hyperframes

Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use hyperframes-animation.

Media & Creative916.5K installs

ai-video-generation

101-skills/superpowers

Generate AI videos with Google Veo, Seedance 2.0, HappyHorse, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 2.0, HappyHorse 1.0, Wan 2.5, Grok Imagine Video, OmniHuman, Fabric, HunyuanVideo. Capabilities: text-to-video, image-to-video, reference-to-video, video editing, lipsync, avatar animation, video upscaling, foley sound. Use for: social media videos, marketing content, explainer videos, product demos, AI avatars. Triggers: video generation, ai video, text to video, image to video, veo, animate image, video from image, ai animation, video generator, generate video, t2v, i2v, ai video maker, create video with ai, runway alternative, pika alternative, sora alternative, kling alternative, seedance, happyhorse

Media & Creative881.5K installs

ai-image-generation

101-skills/superpowers

Generate AI images with GPT-Image-2, FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: GPT-Image-2, FLUX Dev LoRA, FLUX.2 Klein LoRA, Gemini 3 Pro Image, Grok Imagine, Seedream 4.5, Reve, ImagineArt. Capabilities: text-to-image, image-to-image, inpainting, LoRA, image editing, upscaling, text rendering. Use for: AI art, product mockups, concept art, social media graphics, marketing visuals, illustrations. Triggers: flux, image generation, ai image, text to image, stable diffusion, generate image, ai art, midjourney alternative, dall-e alternative, text2img, t2i, image generator, ai picture, create image with ai, generative ai, ai illustration, grok image, gemini image, gpt image, openai image, chatgpt image

Media & Creative880.3K installs