記事執筆時Unreal Engineバージョン:5.2
問題
VisualStudioから、プラグインを含むプロジェクトをビルドする⇒問題なく成功、プラグインも動作する
Unrealエディターから同プロジェクトをパッケージ化⇒問題なく成功、プラグインも動作する
Unrealエディターからプラグインのタブでプラグイン単体をパッケージ化⇒パッケージ化に失敗する(今回の問題点)
解決法
エディターでアウトプットログを確認すると、使用しているクラス・関数等が未定義のエラーが発生。
(状況により差があります)
不足しているヘッダーをインクルードする事で解決する。
概要
OX ENGINEER STUDIO クライアントエンジニアの吉川です。
VisualStudioやUnrealエディターからプロジェクト自体のビルドは出来ていても、プラグイン単体をパッケージ化(ビルド)してみると、失敗する場合があります。
上記の解決法の通り、エラー自体はプラグインでなくても普通に実装中に起きるような内容なので、解決するのは何も難しくないかと思います。
原因
プロジェクトのビルドやパッケージ化と違い、モジュール化されているプラグインをビルド・パッケージ化する際は他のモジュールを参照している場合にエラーとなるようです。
UnrealEngineのモジュール
例えば空のプラグインを作成し、StartupModule内でGLog->Logfを使用してみます。
デフォルトのLoadingPhaseでは、モジュールが読み込まれた後にエディタのアウトプットログにログが出力されます。
空のプラグインのStartupModuleにGLog->Logfによるログ出力を追加
GLog->Logfで[[[Plugin_A test log]]]とログ出力を行っている図
必要なヘッダーがインクルードされていないままGLog->Logfを使用した状態でVSでビルドやプロジェクトのパッケージ化を行ってもエラーは発生しませんが、プラグインのパッケージ化を行うと使用している行でエラーが発生します。
該当行のエラーを見てみるとFOutputDeviceRedirectorが未定義となっています。
(error C2027: use of undefined type ‘FOutputDeviceRedirector’)
FOutputDeviceRedirectorのリファレンスを見ると、ModuleはCoreとなっています。
このモジュールはデフォルトでPluginName.build.csでPublicDependencyModuleNamesに追加されていますが、これによって通常時のビルドは通るものの、単体のプラグインビルド時には作用せずエラーとなります。
(エディターのアウトプットログへの出力は基本的にUE_LOGが推奨されている為、意図がない場合はUE_LOGを使用しましょう)
AActorを引数とする関数を作成しても同様で、AActorのModuleはEngineとなっています。
これもデフォルトで.build.csでPrivateDependencyModuleNamesに追加されていますが、こちらもプラグインのパッケージ化にはエラーとなります。
(error C2061: syntax error: identifier ‘AActor’)(例ではAActorを引数とする関数を作成)
AActorを引数とする関数の追加(内容は空)
余談
DependencyModuleNamesを追加する場合のPublic~/Private~の違いについては、モジュールについての公式ドキュメントにも書いてある通り、モジュールを使用しているのがパブリックであればPublicに(パブリックな.h等)、プライベートであればPrivateに(.cpp等)、モジュール名の追加を行います。
UnrealEngineのモジュール – プライベートおよびパブリックの依存関係
Engine/Engine.hをインクルードする事でも解決しますが、不要なヘッダーも取り込まれてしまう為、極力は必要な物のみ指定しましょう。