エンジン自体がモジュールのコレクションで構成されているのと同じように、各ゲームは 1 つ以上のゲームプレイ モジュールで構成されています。これらは、関連するクラスのコレクションのコンテナであるという点で、エンジンの以前のバージョンのパッケージに似ています。Unreal Engine では、ゲームプレイはすべて C++ で行われるため、モジュールは実際には独自のパッケージ ファイルではなく DLL となります。
ゲーム プロジェクトがまだ作成されていない場合は、ゲームのプロジェクトの作成と設定の手順については、「ゲーム プロジェクトを作成する」を参照してください。
モジュールを作成する
ゲームプレイ モジュールには、少なくともヘッダ ファイル (.h)、C++ ファイル (.cpp)、ビルド ファイル (*.Build.cs) が含まれている必要があります。ヘッダ ファイルは、モジュールのディレクトリの「Public」フォルダ (つまり、「[GameName] \Source\ [ModuleName]\Public」) に配置する必要があります。このファイルには、モジュール内に含まれるクラスをコンパイルするために必要なすべてのヘッダ ファイル (モジュールの自動生成ヘッダを含む) が含まれています。
#include "Engine.h"
#include "EnginePrivate.h"
#include "<ModuleName>Classes.h"
C++ ファイルはモジュールのディレクトリの「Private」フォルダ (つまり「[GameName] \Source\ [ModuleName]\Private」) に配置され、モジュールを登録して実装します。
ゲーム内の少なくとも 1 つのモジュールを、IMPLEMENT_PRIMARY_GAME_MODULE
を使用して登録する必要があります。追加のモジュールでは代替の IMPLEMENT_GAME_MODULE
メソッドを使用できます。ゲーム プロジェクトで複数のゲームプレイ モジュールを使用する方法の詳細については、「複数のゲームプレイ モジュール」セクションを参照してください。
// ゲームのヘッダ ファイルをインクルードする
#include "<ModuleName>.h"
// モジュールをプライマリとして指定する
IMPLEMENT_PRIMARY_GAME_MODULE( <ModuleName>, "<GameName>" );
ビルド ファイルは、ゲームプレイ モジュールのルート ディレクトリ (つまり「[GameName] \Source\ [ModuleName]」) に配置され、UnrealBuildTool がモジュールをコンパイルするために使用する特定の情報を定義します。
using UnrealBuildTool;
public class <ModuleName> : ModuleRules
{
public <ModuleName>( TargetInfo Target )
{
PublicDependencyModuleNames.AddRange( new string[] { "Core", "Engine" } );
PrivateDependencyModuleNames.AddRange( new string[] { "RenderCore" } );
}
}
INI ファイルを設定する
新しいゲームプレイ モジュールには UObject コードが含まれるため、いくつかの構成が必要になります。
-
モジュールは、「DefaultEngine.ini」ファイルのいくつかの領域に追加する必要があります。
[UnrealEd.EditorEngine]
セクション内のEditPackages
配列:[UnrealEd.EditorEngine] +EditPackages=<ModuleName>
[Launch]
セクション:[Launch] Module=<ModuleName>
[/Script/Engine.UObjectPackages]
セクションのNativePackages
配列:[/Script/Engine.UObjectPackages] +NativePackages=<ModuleName>
複数のゲームプレイ モジュール
ゲーム DLL のモジュールをどうするのかについては、よく考える必要があります。ゲームを多数の DLL ファイルに分割することは、その利点以上に問題が発生する可能性があります。したがって、各チームがそれぞれのニーズと原則に基づいてどうするのかを決定する必要があります。複数のゲームプレイ モジュールを使用すると、リンク時間が短縮され、コードのイテレーションが高速化されます。しかし、モジュールの数が増えると、DLL エクスポートやインターフェース クラスをより頻繁に処理する必要が生じます。このトレードオフはエンジンとエディタ コードにとっては正しいものですが、ゲームプレイにとって良いのかはまた別です。
プライマリ ゲーム モジュールを作成してから、任意の数のゲーム固有の追加モジュールを作成できます。これらの新しいモジュールの「*.Build.cs」ファイルを作成し、これらのモジュールへの参照をゲームの「Target.cs」ファイル (OutExtraModuleNames 配列) に追加できます。C++ コード内のゲーム モジュールには、適切なマクロを必ず使用するようにしてください。少なくとも 1 つのモジュールは IMPLEMENT_PRIMARY_GAME_MODULE
マクロを使用する必要がありますが、他のすべてのモジュールも IMPLEMENT_GAME_MODULE
マクロを使用する必要があります。その後、UBT はモジュールを自動的に検出し、追加のゲーム DLL ファイルをコンパイルします。
制限事項
相互に依存するモジュール (関数とデータの相互エクスポートとインポートの両方 - たとえば、Engine モジュールと UnrealEd モジュール) の作成はサポートされています。しかし、これらはコンパイル時には理想的なものではないため、変数の静的初期化を行う際に問題が発生する場合があります。相互依存のないゲームプレイ モジュールは設計と保守が難しくなります。しかし、その分コードがきれいになる可能性があります。