関連ブログ
- [UE5] 元の位置に戻るカメラの実装 2024.12.18UE
- [UE5]難易度変更に対応したシューティングゲームを作ってみよう 2024.12.11UE
- [UE5] インタラクト可能なモノの量産に役立つBPを作ってみよう 2024.12.04UE
CATEGORY
2023.12.13UEUE/ C++
執筆バージョン: Unreal Engine 5.3 |
今回はIncludePathにプロジェクト名を追加する方法をご紹介したいと思います。
UEでは、新規でC++のクラスを追加する際、エディタ上から追加する事でソースコードが自動生成される事はご存じかと思います。
ですが、その際に特定のフォルダ構成にしていないと、Includeのヘッダーファイルのパスが通らずにビルドエラーが発生してしまいます。
そこで今回ご紹介する方法により、簡単にビルドエラーを回避する事が可能になります。
まずは現象の確認をしてみましょう。
今回は空のC++プロジェクトで十分ですので、上記画像のような設定でプロジェクトを作成します。
「Tools」のメニューから「New C++ Class…」を選択します。
今回は適当に親クラスを「Character」クラスにしてみましょう。
今回追加するクラスのクラス名を「MyCharacter」とし、整理のためプロジェクトフォルダの直下に新規で「Characters」フォルダを作成して、その中にヘッダーファイルとCppファイルを入れる事にします。
そしてこの構成で「Create Class」をクリックすると…
ライブコーディングが走りますが、途中でビルドエラーが発生してしまします。
ログにはインクルードで指定しているヘッダーファイルが見つからないと出ています。
ちなみに画像ではVisualStudioが日本語のため、Logウインドウでの表示が文字化けしてエラー確認が難しいですが、エディタを閉じて普通にプロジェクトをビルドすると、
1 |
C:\TestProjects\MyProject\Source\MyProject\Characters\MyCharacter.cpp(4): fatal error C1083: include ファイルを開けません。'Characters/MyCharacter.h':No such file or directory |
とエラーが出てエディタが起動できません。
この現象自体はUE4.23からUE4.24にバージョンアップした際、エンジン側のビルドの仕組みが大きく変わった影響によるものです。
ただ、このエラー自体を回避するのは簡単です。
いくつか方法はありますが、まず一つ目に紹介するのが、おそらくUEが推奨している方法で「Public/Private」フォルダを含める事です。
C++クラスを追加する際に「ClassType」を「Public」か「Private」かを指定する事で自動的に該当のフォルダが生成されます。
この状態ですと、ビルドエラーは発生しなくなります。
ですが、文化の違いや運用の都合でPublicフォルダやPrivateフォルダを挟みたくない場合もあるかと思います。
その際は、以下のようにIncludeのヘッダーファイルにパスを追加すればよいです。
#include “Characters/MyCharacter.h” → #include “MyProject/Characters/MyCharacter.h”
ただし、この手法ではプロジェクトにC++クラスを追加するたびに、せっかくUE側が自動でソースコードを生成してくれているのに、わざわざこちらで編集する必要があり、非常に手間です。
そこで今回ご紹介する手法が以下になります。
「MyProject\Source\MyProject\MyProject.Build.cs」ファイルを編集し、IncludePathにプロジェクトフォルダを追加すればよいのです。
この時、単純にプロジェクト名を直接入力して追加してもよいのですが、その場合はプロジェクト名を変更した際に、フォルダ名も一緒に変更してしまうとパスが通らなくなってしまいます。
また、直接文字列を指定するのも気持ち悪いですよね。そこで以下のようにプロジェクト名を自動で取得してIncludePathに追加する事にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnrealBuildTool; public class MyProject : ModuleRules { public MyProject(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); PrivateDependencyModuleNames.AddRange(new string[] { }); // パスにプロジェクト名を追加 string ProjectName = Target.ProjectFile.GetFileNameWithoutExtension(); PublicIncludePaths.Add(ProjectName); // Uncomment if you are using Slate UI // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // Uncomment if you are using online features // PrivateDependencyModuleNames.Add("OnlineSubsystem"); // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true } } |
これにより、毎回Includeの編集を必要とせず、PublicやPrivateフォルダを作らずにC++クラスを追加できるようになりました。
私みたいにCppファイルとヘッダーファイルは同じフォルダに置きたいし、PublicやPrivateフォルダを挟みたくない!という人は是非活用してみてください。