ue-module-build-system について
Unreal Engine 5.8 開発者向けのスキルです。UnrealBuildTool のモジュール・ターゲットルール、プロジェクトやプラグインの記述子、モジュール登録を扱います。依存関係の設定、作成手順、ビルドエラーの診断も案内します。
主な機能
- 01`Build.cs` の依存関係とインクルードパスの解説
- 02`Target.cs` とビルド設定の構成
- 03`.uproject` と `.uplugin` の設定
- 04モジュールやプラグインの作成・登録
- 05UBT、UHT、リンカーエラーの診断
活用シーン
- 01モジュール依存関係とヘッダー参照の調整
- 02UE モジュールまたはプラグインの作成
- 03ビルド、リンク、モジュール読み込み障害の調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ quodsoler/ unreal-engine-skills --skill ue-module-build-systemインストール後、Claude Code で/ue-module-build-systemを入力して読み込まれたか確認します。
同梱ファイルreferences/build-cs-reference.mdreferences/common-build-errors.md
詳細
UE モジュールとビルドシステム
対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーと UnrealBuildTool のソースコードで検証済みです。古い形式は「非推奨 — 使用しないでください」に記載しています。
このスキルでは、UnrealBuildTool(UBT)の ModuleRules(*.Build.cs)と TargetRules(*.Target.cs)、.uproject および .uplugin ディスクリプター、モジュール登録(Modules/ModuleManager.h の IModuleInterface と IMPLEMENT_MODULE、モジュール Core)、プラグイン検出(Interfaces/IPluginManager.h の IPluginManager、モジュール Projects)、ならびにこれらのファイルが原因となるコンパイラー、リンカー、UHT、UBT のエラーについて扱います。
コンテキスト
.agents/ue-project-context.md が存在する場合は読み込んでください(モジュール名、規約、有効なプラグイン、GAS/ネットワーク設定)。存在しなくても作業を中断しないでください。
リクエストとコードベースから対象領域を特定してください。2 つの妥当な解釈によって異なるコードが生成される場合に限り、質問してください。
| リクエストの内容… | 参照先 |
|---|---|
既存の Build.cs における依存関係、インクルードパス、PCH、警告 | Build.cs の構造 |
Target.cs、BuildSettingsVersion、IncludeOrderVersion、ターゲットの種類 | Target.cs |
.uproject、モジュールの Type、LoadingPhase、プラグインの有効化 | .uproject ファイル |
モジュールの追加(IMPLEMENT_MODULE、モジュールインターフェース、StartupModule) | 新しいモジュールの作成 |
プラグインの追加(.uplugin、ランタイムとエディターモジュール、依存関係) | プラグインの作成 |
| 「型 X を使うには、どのモジュールを追加すればよいですか?」 | この型を提供するモジュール |
| LNK2019、C1083、UHT、UBT、または実行時のモジュール読み込みエラー | ビルドエラーの解決 |
Build.cs の構造
各モジュールには、Public/ フォルダーと Private/ フォルダーの隣に <ModuleName>.Build.cs があります。クラス名はモジュール名と一致する必要があります。
// 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 と Private の依存関係
| フィールド | 使用する場合 |
|---|---|
PublicDependencyModuleNames | モジュールの型が、いずれかの Public/ ヘッダー(基底クラス、メンバー、パラメーター、戻り値の型、UPROPERTY)に現れる場合です。下流モジュールはインクルードパスを継承します。 |
PrivateDependencyModuleNames | モジュールを Private/ の .cpp ファイルまたはプライベートヘッダーでのみ使用する場合です。 |
PublicIncludePathModuleNames / PrivateIncludePathModuleNames | モジュールのヘッダー(前方宣言、インライン型)が必要ですが、そのモジュールのシンボルにはリンクしない場合です。 |
DynamicallyLoadedModuleNames | 自分で FModuleManager::Get().LoadModule(...) を呼び出す場合です。UBT はモジュールがビルドされることだけを保証します。 |
まずはプライベートにし、パブリックヘッダーで必要になった場合にのみパブリックへ変更してください。すべてをパブリックにすると、下流のすべてのモジュールでコンパイル時間が増加します。
インクルードパスと IWYU
UBT は Public/、Internal/、Private/ を自動的に検出します。PublicIncludePaths/PrivateIncludePaths が必要なのは、追加のサブフォルダーがある場合だけです。BuildSettingsVersion.V2 以降では bLegacyPublicIncludePaths が false になるため、他のモジュールのヘッダーは、そのモジュールの Public/(または Classes/)ルートからの相対パスで記述します。
// 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 のデフォルトは IWYUSupport.Full で、UnrealBuildTool -Mode=IWYU によってモジュールのインクルードを書き換えられます。手動で保守するコードでは IWYUSupport = IWYUSupport.KeepAsIs を設定してください。
API エクスポートマクロ
UBT は <MODULENAME>_API(モジュール名を大文字にして _API を付けたもの)を定義します。モジュールのコンパイル時には DLLEXPORT、インポート側では DLLIMPORT となり、モノリシックビルドでは空になります。他のモジュールから参照されるものには、このマクロが必要です。
// Source/MyGame/Public/MyGameTypes.h
#pragma once
#include "CoreMinimal.h"
class MYGAME_API FMyGameTypes
{
public:
void DoSomething();
};
MYGAME_API void MyGameFreeFunction();
エンジンヘッダーでは、ファイルの先頭で #define UE_API CORE_API としてこれをラップし、末尾で #undef UE_API を指定しています(Async/Mutex.h)。これはエンジン専用の規約です。プロジェクトコードでは MYGAME_API を直接記述します。他のモジュールから参照されるクラスに MYGAME_API がないことは、LNK2019 の最も一般的な原因です。
警告とコンパイラーフラグ
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");
すべての ModuleRules フィールド、RuntimeDependencies API、プラットフォーム条件、エンジンモジュールの完全な一覧については、references/build-cs-reference.md を参照してください。
Target.cs
Source/MyGame.Target.cs と Source/MyGameEditor.Target.cs です。クラス名は <FileName>Target にする必要があります。そうしないと、UBT は「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 では、Type = TargetType.Editor; と ExtraModuleNames.AddRange(new string[] { "MyGame", "MyGameEditor" }); 以外は同じ本体を持つ MyGameEditorTarget を宣言します。
BuildSettingsVersion.V7は 5.8 のプロジェクトテンプレートで出力される値です(LatestもV7と同じです)。明示的な値を固定してください。Latestはエンジンをアップグレードするたびに意味が変わります。EngineIncludeOrderVersion.Unreal5_8は、削除された暗黙的なエンジンインクルードをコードで引き続き使用できるようにするUE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_8定義を選択します。Unreal5_1~Unreal5_5は[Obsolete]でサポート対象外、Unreal5_6は非推奨です。モジュールはModuleRules.IncludeOrderVersionで上書きできます。
BuildSettingsVersion | 有効になる既定値 |
|---|---|
V2 | PCHUsage = UseExplicitOrSharedPCHs、bLegacyPublicIncludePaths = false |
V3 | bLegacyParentIncludePaths = false |
V4 | CppStandard の既定値が Cpp20 に変更、WindowsPlatform.bStrictConformanceMode = true |
V5 | bValidateFormatStrings = true |
V6 | WindowsPlatform.bStrictInlineConformance = true、UndefinedIdentifierWarningLevel = Error |
V7(= Latest) | ReturnTypeWarningLevel、DanglingWarningLevel、UnreachableCodeWarningLevel = Error |
TargetType | ビルド内容 |
|---|---|
Game | スタンドアロンのゲーム実行ファイル |
Editor | エディターのビルド。Editor 型のモジュールを含みます |
Client | サーバー専用コードを含まないネットワーククライアント |
Server | レンダラーを含まない専用サーバー |
Program | スタンドアロンツール(bCompileAgainstEngine/bCompileAgainstCoreUObject の選択が必要です) |
ビルド構成(UnrealTargetConfiguration):Debug、DebugGame(エンジンは最適化、ゲームは最適化なし)、Development(既定値)、Test、Shipping。便利なターゲットスイッチ:bUseUnityBuild、bUseLoggingInShipping、bUseChecksInShipping、bWithLiveCoding、LinkType = TargetLinkType.Monolithic、GlobalDefinitions/ProjectDefinitions、共有ビルド環境への違反(例:エディターターゲットによる定義の変更)を「無視する」ための bOverrideBuildEnvironment = true。
.uproject ファイル
{
"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 は、このモジュールをビルドするための追加依存関係の一覧を記述子で指定するものです。プラグイン参照では、Name、Enabled、Optional、TargetAllowList/TargetDenyList、PlatformAllowList/PlatformDenyList、TargetConfigurationAllowList を指定できます。
モジュールの種類(ModuleHostType)
Type | 読み込まれる条件 |
|---|---|
Runtime | UE ランタイムを使用するすべてのターゲット(ゲームコードの既定値) |
RuntimeNoCommandlet | コマンドレット以外のすべてのターゲット |
RuntimeAndProgram | すべてのターゲットまたはプログラム |
CookedOnly/UncookedOnly | Cook 済みビルドのみ/未 Cook(エディター、PIE)ビルドのみ — UncookedOnly は Blueprint ノード(K2Node)モジュールに使用する型です |
Developer | 開発者ツールのサポートが有効な場合のみ(非推奨:DeveloperTool を使用してください) |
DeveloperTool | bBuildDeveloperTools が有効なすべてのターゲット |
Editor/EditorNoCommandlet | エディターのみ/コマンドレットを除くエディター |
EditorAndProgram | エディターまたはプログラムのターゲット |
Program | プログラムのターゲットのみ |
ServerOnly/ClientOnly/ClientOnlyNoCommandlet | サーバーのみ/クライアント、コマンドレット、エディター/クライアントとエディター |
External | 自動では読み込まれず、参照のみ |
読み込みフェーズ(ModuleLoadingPhase)
LoadingPhase | タイミング |
|---|---|
EarliestPossible | プラグインを読み込めるようになった直後(GConfig が存在する状態) |
PostConfigInit | 設定システムの直後。非常に低レベルなフックのみ |
PostSplashScreen | システムのスプラッシュ画面の次に表示される最初の画面 |
PreEarlyLoadingScreen | PostConfigInit の後、CoreUObject の初期化前 |
PreLoadingScreen | ロード画面が表示される前 |
PreDefault | Default の直前。アセットタイプや、ほかのモジュールが必要とするカスタムクラス |
Default | エンジンの初期化中、ゲームモジュールの読み込み後(大半のモジュール) |
PostDefault | Default の直後 |
PostEngineInit | エンジンの初期化完了後 |
None | 自動読み込みされません。FModuleManager::Get().LoadModule() を使用します |
新しいモジュールの作成
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)
マクロ(Modules/ModuleManager.h) | 用途 |
|---|---|
IMPLEMENT_MODULE(FMyModule, MyModule) | ゲームプレイクラスを含まないモジュール(ツール、エディター、ライブラリ) |
IMPLEMENT_GAME_MODULE(FMyModule, MyModule) | ゲームプレイの UCLASS を含むモジュール。IMPLEMENT_MODULE に展開されます |
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, MyGame, "MyGame") | ゲームごとに1つだけ指定します。モノリシックビルドでは、UE_PROJECT_NAME からプロジェクト名を定義します。3番目の引数は DEPRECATED_GameName(ModuleManager.h:1100)で、使用されません |
FDefaultModuleImpl と FDefaultGameModuleImpl は、起動ロジックを持たないモジュール向けの既成クラスです。FDefaultGameModuleImpl::IsGameModule() は true を返すため、ホットリロードツールはゲームコードとして扱います。2番目のマクロ引数は Build.cs のモジュール名と一致している必要があります。モノリシック形式とモジュラー形式の両方で、マクロは UE_STATIC_ASSERT_WARN を使って UE_MODULE_NAME と照合します(ModuleManager.h:950、:968)。このチェックは「Module name mismatch」という非推奨形式の 警告 を出しますが、エラーになるのは bWarningsAsErrors の場合のみです。その他の IModuleInterface フック:PreUnloadCallback()、PostLoadCallback()、SupportsDynamicReloading()、SupportsAutomaticShutdown()。
続いて、モジュールを3か所に登録します。.uproject(または .uplugin)の Modules 配列、モジュールをビルドする各 Target.cs の ExtraModuleNames、およびそのモジュールを使用するモジュールの依存関係リストです。エディター専用モジュール("Type": "Editor"、if (Target.bBuildEditor) 内の PrivateDependencyModuleNames.Add("UnrealEd"))については、ue-editor-tools で説明しています。
プラグインの作成
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 }
]
}
- 依存先のモジュールを含むプラグインはすべて
Pluginsに宣言してください。宣言しない場合、UBT は「Plugin 'MyPlugin' does not list plugin 'X' as a dependency, but module 'MyPlugin' depends on module 'Y'」という警告を出します。 IsExperimentalVersion/IsBetaVersionは、エディターに成熟度として表示される項目です。EnabledByDefault: trueにすると、.uprojectに記載がなくてもすべてのプロジェクトでプラグインが有効になります。- コンテンツのみのプラグインでは
Modulesを完全に省略し、"CanContainContent": trueのままにします。 - ゲーム機能プラグイン(
UGameFeatureData、アクション)は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" });
}
}
ランタイムモジュールにエディターヘッダーを含めないでください。エディターコードは #if WITH_EDITOR で、エディター依存関係は if (Target.bBuildEditor) で条件分岐します。
エンジンのプラグインとプロジェクトのプラグイン: Engine/Plugins/ は、そのインストール環境にあるすべてのプロジェクトで共有されます。<Project>/Plugins/ はプロジェクトとともに移動し、名前が重複した場合はこちらが優先されます。インストール済み(Launcher)エンジンに含まれるのは、プリコンパイル済みのエンジンモジュールのみです。プリコンパイルされていないエンジンモジュールに依存すると、「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.」というエラーが発生します。
この型を提供するモジュール
*DependencyModuleNames に追加 | 対象 | 有効にするプラグイン |
|---|---|---|
Core | FString、TArray、FName、UE_LOG、FModuleManager | — |
CoreUObject | UObject、UClass、FInstancedStruct、リフレクション | — |
Engine | AActor、UActorComponent、UWorld、UGameInstance、UAudioComponent | — |
InputCore | FKey、EKeys | — |
EnhancedInput | UInputAction、UInputMappingContext、UEnhancedInputComponent | EnhancedInput |
GameplayTags | FGameplayTag、FGameplayTagContainer、UGameplayTagsManager | — |
GameplayTasks | UGameplayTask、UGameplayTasksComponent | — |
GameplayAbilities | UAbilitySystemComponent、UGameplayAbility、UGameplayEffect | GameplayAbilities |
NetCore | FFastArraySerializer、プッシュモデルのマクロ | — |
DeveloperSettings | UDeveloperSettings | — |
Slate、SlateCore | SWidget、SCompoundWidget/FSlateBrush、FSlateColor | — |
UMG | UUserWidget、UButton、UTextBlock | — |
CommonUI、CommonInput | UCommonActivatableWidget、UCommonButtonBase | CommonUI |
ModelViewViewModel | UMVVMViewModelBase、UMVVMView | ModelViewViewModel(5.8 ではベータ版) |
AIModule、NavigationSystem | AAIController、UBehaviorTree/UNavigationSystemV1 | — |
StateTreeModule、GameplayStateTreeModule | UStateTree、FStateTreeTaskBase/UStateTreeComponent | StateTree、GameplayStateTree |
MassEntity、MassCore、MassSignals | FMassEntityManager、UMassProcessor/FTransformFragment/UMassSignalSubsystem | —(コアモジュール) |
Niagara | UNiagaraComponent、UNiagaraSystem、UNiagaraFunctionLibrary | Niagara |
PCG | UPCGComponent、UPCGGraph、UPCGSettings | PCG |
Mover | UMoverComponent、UCharacterMoverComponent | Mover(5.8 では試験的機能) |
GameplayCameras | UGameplayCameraComponent、UCameraAsset | GameplayCameras(5.8 では試験的機能) |
LevelSequence、MovieScene | ULevelSequence、ULevelSequencePlayer/UMovieScene | — |
PhysicsCore、Chaos | UPhysicalMaterial/Chaos ソルバーの型 | — |
ProceduralMeshComponent | UProceduralMeshComponent | ProceduralMeshComponent |
GeometryScriptingCore、GeometryFramework | UGeometryScriptLibrary_MeshPrimitiveFunctions/UDynamicMesh | GeometryScripting |
AudioExtensions | IAudioParameterControllerInterface、FAudioParameter | — |
エディターおよびネットワーキングのモジュールを含む全表は、references/build-cs-reference.md にあります。
ビルドエラーの解決
| エラーメッセージ | 最初に確認すること |
|---|---|
LNK2019 unresolved external symbol / LNK2001 | モジュールが *DependencyModuleNames に含まれていない、または参照先クラスに MYGAME_API がない |
C1083: Cannot open include file | モジュールが依存関係に含まれていない、またはモジュールの Public/ ルートからの相対パスでインクルードが記述されていない |
#include found after .generated.h file | #include "MyClass.generated.h" を最後のインクルードに移動する |
Expected a GENERATED_BODY() at the start of the class | UCLASS/USTRUCT 本体の最初の行に GENERATED_BODY() を追加する |
Could not find definition for module 'X' | X.Build.cs が見つからない、または .uproject/ExtraModuleNames のモジュール名が間違っている |
Circular dependency for 'X.Build.cs' detected | 共通モジュールを切り出すか、一方を DynamicallyLoadedModuleNames に切り替える |
Missing precompiled manifest for 'X' | インストール済みエンジンではそのエンジンモジュールをコンパイルできないため、依存関係を削除するか、ソースビルドを使用する |
Plugin 'X' failed to load because module 'Y' could not be found | プラグインを再ビルドする。そのモジュールはこのターゲット用にコンパイルされていない |
Module 'X' not found - its StaticallyLinkedModuleInitializers function is null | モノリシックビルドでモジュールがリンクされていないため、ExtraModuleNames または .uplugin に追加する |
詳しいメッセージ、原因、MSVC の警告レベル対応表、Live Coding の制限、クックの失敗については、references/common-build-errors.md を参照してください。
非推奨 — 使用しないでください
| 出力しないでください | 5.8 で使用 | 出典 |
|---|---|---|
bEnforceIWYU = true | IWYUSupport = IWYUSupport.Full(すでにデフォルトです) | Configuration/Rules/ModuleRules.Obsolete.cs の [Obsolete("Deprecated in UE5.2 - Use IWYUSupport instead.")] |
bUseAVX = true | MinCpuArchX64 = MinimumCpuArchitectureX64.AVX2 | ModuleRules.Obsolete.cs の [Obsolete("bUseAVX is obsolete ... replace with MinCpuArchX64")] |
ModuleRules/TargetRules の ShadowVariableWarningLevel = WarningLevel.Error | CppCompileWarningSettings.ShadowVariableWarningLevel | ModuleRules.Obsolete.cs、TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.6 ...")] |
UnsafeTypeCastWarningLevel = ... を直接指定 | CppCompileWarningSettings.UnsafeTypeCastWarningLevel | ModuleRules.Obsolete.cs、TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.6 ...")] |
bEnableUndefinedIdentifierWarnings/bUndefinedIdentifierErrors | CppCompileWarningSettings.UndefinedIdentifierWarningLevel | 2 段階で変更されました。5.5 ではルールクラスの UndefinedIdentifierWarningLevel に移動し、5.6 では CppCompileWarningSettings の配下に移動しました。ModuleRules.Obsolete.cs、TargetRules.Obsolete.cs の [Obsolete(...)] |
TargetRules の DeprecationWarningLevel = ... | CppCompileWarningSettings.DeprecationWarningLevel | TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.6 ...")] |
bUsesSteam = true | 削除してください。このフラグは何もしません | TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.5 - No longer used in engine.")] |
bCompileChaos、bUseChaos、bCompilePhysX、bCompileAPEX、bCompileNvCloth | 削除してください。Chaos は常に有効です | TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.1 ...")] |
bDisableDebugInfo = true | DebugInfo = DebugInfoMode.None | TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.4 - Replace with TargetRules.DebugInfo")] |
bUseFastPDBLinking = true | 削除してください | TargetRules.Obsolete.cs の [Obsolete("Deprecated in UE5.7 - No longer recommended")] |
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1 … Unreal5_5 | EngineIncludeOrderVersion.Unreal5_8 | Configuration/Rules/TargetRules.cs の [Obsolete("The Unreal 5.5 include order is unsupported.")] |
EngineIncludeOrderVersion.Unreal5_6 | Unreal5_8 | TargetRules.cs の [Obsolete("... deprecated and will be unsupported in 5.9.")] |
ディスクリプター内の "WhitelistPlatforms"、"BlacklistPlatforms"、"WhitelistTargets" | "PlatformAllowList"、"PlatformDenyList"、"TargetAllowList" | Configuration/Descriptors/ModuleDescriptor.cs の非推奨値へのフォールバック読み取り処理 |
"Type": "Developer" | "Type": "DeveloperTool" | ModuleDescriptor.cs の「The 'Developer' module type has been deprecated in 4.24」 |
リリース済みプロジェクト内の EngineIncludeOrderVersion.Latest、BuildSettingsVersion.Latest | Unreal5_8/V7 に固定してください | UBT ドキュメント:「Using Latest comes with a high risk of introducing compile errors」(TargetRules.cs) |
よくある間違い
すべてを PublicDependencyModuleNames に追加する: 依存先のすべてのモジュールがインクルードパスを継承し、再コンパイルの頻度が高くなります。Public/ ヘッダーのいずれかで必要になるまでは、依存関係を非公開にしておきます。
MYGAME_API の付け忘れ: クラスは自身のモジュール内ではコンパイルできますが、別のモジュールから使用すると LNK2019 で失敗します。このマクロは定義ではなく、クラスまたは非メンバー関数の宣言に追加します。
IMPLEMENT_MODULE の名前の不一致: Build.cs が MyModule であるモジュール内で IMPLEMENT_MODULE(FMyModule, MyGameplay) を使うと、「Module name mismatch」警告(致命的なエラーではなく UE_STATIC_ASSERT_WARN)が出ます。また、これとは別に、リンカーが IMPLEMENT_MODULE_MyModule を探すため、モノリシックビルドでは読み込みに失敗します。第 2 引数はクラス名ではなく、モジュール名です。
ランタイムモジュールにエディターコードを含める: #include "Editor.h" を使うか、PublicDependencyModuleNames に UnrealEd を追加すると、Game、Client、Server ターゲットで問題が発生します。#if WITH_EDITOR と if (Target.bBuildEditor) で囲むか、コードを Editor タイプのモジュールに移します。
モジュールを 1 か所にしか登録しない: モジュールは .uproject/.uplugin の Modules と、各 Target.cs の ExtraModuleNames の両方に記載する必要があります。どちらかが欠けると、「Could not find definition for module」が表示されるか、モジュールが読み込まれません。
登録に不適切な LoadingPhase を使う: 他のモジュールが Default で読み取るアセットタイプ、カスタム UClass 登録、コンソール変数は、PreDefault で読み込む必要があります。
プラグインの依存関係を宣言しない: .uplugin のモジュールが Plugins エントリなしで別のプラグインのモジュールに依存すると、UBT の依存関係に関する警告が出ます。また、もう一方のプラグインが無効になったときに問題が発生します。
推移的なインクルードに依存する: Engine/World.h がたまたまインクルードしていたためにコンパイルできていたヘッダーは、新しい IncludeOrderVersion でそのエンジンヘッダーのインクルードが削減されると、問題が発生します。使用するものは明示的にインクルードします。
ヘッダーパスが間違っている: Actor.h または Engine/Actor.h をインクルードすると C1083 が発生します。ファイルは Engine/Classes 配下の GameFramework/Actor.h です。
関連するスキル
ue-cpp-foundations—UCLASS/UPROPERTY/UFUNCTIONの指定子、GENERATED_BODY、UHT がパブリックヘッダーで必要とするものue-editor-tools— エディター専用モジュール、UnrealEd/ToolMenus/PropertyEditorの依存関係、UEditorSubsystemue-testing-debugging—UE_LOGカテゴリーとbUseLoggingInShipping、オートメーションテストのモジュールとターゲットue-game-features— Game Feature プラグイン、UGameFeatureData、UGameFeatureAction、Modular Gameplayue-project-context— モジュール名、ターゲット、有効なプラグインを記録する.agents/ue-project-context.mdファイルue-data-assets-tables— UDataAsset、UDataTable、ソフト参照、Asset Manager、非同期読み込み