概要
C++のクラスを追加する際にUEの推奨の場合、Class TypeでPublic、Privateを指定する必要があります。
Class Typeを指定した場合、Public、Privateのフォルダが作成され、ヘッダーファイル、ソースファイルがそれぞれのフォルダに分けられます。
人によってはフォルダを分けられるのは分かりずらい、煩雑になるということで同じフォルダ内でヘッダーファイル、ソースファイルを配置したいというケースも出てくると思います。
その場合のインクルードパスの指定についてです。
※本記事はC++での開発を前提としています。
動作環境
UnrealEngine 5.4.4
Class Typeを指定した場合
C++のソースを追加する際にClass Typeを指定すると思います。
これはUEが推奨している方法でプロジェクト以下にPublic、Privateのフォルダ作成され、それぞれのフォルダ以下にcppやhが配置されます。
Publicの場合はヘッダーファイル(.h)はPublicに配置され、ソースファイル(.cpp)はPrivateに配置されます。
Privateの場合はヘッダーファイル、ソースファイルともにPrivate以下に配置されます。
これはモジュールとして外部に公開するものかどうかで指定するものと思われます。
Privateにした場合はモジュール内のみでの参照が可能となります。
新規にプロジェクトを作成した直後のvcxprojを確認すると、まだインクルードパスにPublic、Privateなどは追加されていません。
TestProjectというプロジェクトを作成した場合、vcxprojファイルは以下のフォルダに作成されます。
TestProject\Intermediate\ProjectFiles\TestProject.vcsproj
プロジェクトのSource/{Project}以下にPublic、Privateのフォルダが存在していれば、ソリューション生成(Generate VisualStudio project files)で生成されるvcxprojの
TestProjectというプロジェクトで、Class Typeを指定してソリューションの生成を行った場合、vcxprojには....\Source\TestProject\Public、....\Source\TestProject\Privateが追加されます。
これによりHoge/AHogeActor.cppなどを追加した際も以下のインクルードで該当ファイルが参照できるようになっています。
#include "Hoge/AHogeActor.h"
Class Typeを指定しない場合
個人やプロジェクトのルールなどでPublic、Privateに分けたくないなどの理由でPublic、Privateのフォルダを入れずにそのままヘッダーファイル、ソースファイルを同じフォルダ(階層)にするケースがあると思います。
C++でクラスを作成する際にClass Typeをしないで作成した場合に指定したフォルダ以下にヘッダーファイル、ソースファイルが追加されます。
この場合にC++で新規のクラスを追加した場合、ソースファイル(cpp)のビルドでヘッダファイルの参照が正しく行われずビルドエラーとなります。
#include "Hoge/AHogeActor.h" // ←ビルドエラー
その場合、vcxprojの方にはインクルードパスの設定が行われないため、そのままであれば{Project}のパスを追加、もしくは同フォルダ以内のヘッダーファイルであればそのフォルダのパスを削除する必要が出てきます。
#include "Hoge/AHogeActor.h" // ←ビルドエラー ↓ #include "AHogeActor.h" もしくは #include "TestProject/Hoge/AHogeActor.h"
これはUEが自動生成するソースがClass Typeを指定しないことで想定されていないインクルードパスの構成になってしまうためです。
Class Typeを指定しないケースでもClass Typeを指定した場合と同様のインクルードパスで参照できるようにしたい場合、プロジェクトのBuild.csにインクルードパスを指定することで対応できます。
TestProjectの場合、TestProject/Source/TestProject/以下にTestProject.Build.csというファイルがあるのでPublicIncludePathsでインクルードパスを追加することができます。
// Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; public class TestProject: ModuleRules { public TestProject(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" }); PublicIncludePaths.Add(ModuleDirectory); } }
ModuleDirectoryでプロジェクトの相対パスが取得できるようなので、そのパスをPublicIncludePathsで追加します。
追加した後で再度ソリューションファイルを生成します。
vcsprojの
この状態であればClass Typeを指定しない状態で新規に追加してもビルドエラーにはならず、Class Typeを指定した場合と同様のパスでヘッダーファイルを参照できるようになります。
Class Typeを指定しない場合はこのあたりに注意しておく必要が出てくると思われます。