Unreal Engine のモジュールは、コードを整理し、プロジェクトのビルド時間を向上して、システムとコードのロード/アンロード プロセスを設定するための便利な方法です。このガイドでは、C++ で新しいランタイム モジュールを最初から実装するために必要なステップについて説明します。このモジュールは、プロジェクトの プライマリ モジュール とは区別されます。
この例で使用するモジュールの名前は「ModuleTest」です。
1. 必要な設定
このガイドの手順に沿うには、まず最初に「MyProject」という名前の C++ プロジェクト を新たに作成してください。ブループリントのみのプロジェクトを使用する場合は、Unreal Editor で C++ コードを新たに作成し、これを C++ プロジェクトに変換してください。
2. ディレクトリを設定する
まず、モジュールとそのコードを含めるディレクトリを設定する必要があります。
-
プロジェクトのルート ディレクトリに移動し、「Source」フォルダを開きます。
-
プロジェクトの「Source」フォルダ内に、「ModuleTest」という名前の新しいフォルダを作成します。これがモジュールのルート ディレクトリになります。
-
モジュールのルート ディレクトリ内で、「Private」と「Public」という 2 つのフォルダをそれぞれ作成します。
ディレクトリの構造は次のようになります。
- MyProject
- Source
- MyProject.Target.cs
- MyProjectEditor.Target.cs
- MyProject (ゲーム モジュールのプライマリ フォルダ)
- Private
- Public
- MyProject.Build.cs
- ゲーム モジュールに含まれるその他の C++ クラス
- ModuleTest
- Private
- Public
- Source
3. 「Build.cs」ファイルを作成する
依存関係の確認のために Unreal Build Tool (UBT) がプロジェクトのディレクトリ全体を確認する際は、IDE ソリューションファイルが無視されて、代わりに「Source」フォルダにある「Build.cs
」ファイルが確認されます。すべてのモジュールには「Build
.cs」ファイルが必要で、これがないと UBT では確認を行うことができません。
「Build.cs
」ファイルを設定するには、次の手順を実行します。
- モジュールのルート ディレクトリ内に「
ModuleTest.Build.cs
」というファイルを作成します。このファイルを開き、次のコードを追加します。
ModuleTest.Build.cs
using UnrealBuildTool;
public class ModuleTest:ModuleRules
{
public ModuleTest(ReadOnlyTargetRules Target) : base(Target)
{
}
}
This will make your module visible to the Unreal build system.
- Edit the constructor so that it reads as follows:
ModuleTest.Build.cs
public ModuleTest(ReadOnlyTargetRules Target) : base(Target)
{
PrivateDependencyModuleNames.AddRange(new string[] {"Core", "CoreUObject", “Engine”});
}
これにより、Core
、CoreUObject
、Engine
の各モジュールが、モジュールのプライベートな依存関係として追加されます。また、このガイドの後のセクションで使用するいくつかのクラスがこのモジュールで利用できるようになります。
このモジュールのフォルダにコードを追加すると、UBT によってプロジェクトがビルドされる際と、IDE プロジェクト ファイルを生成する際の両方で、そのコードが発見可能になります。
4. モジュールを C++ で実装する
「Build.cs
」ファイルによりモジュールが UBT で発見可能になりますが、エンジンでのロード/アンロードを可能にするために、モジュールを C++ クラスとして実装する必要もあります。
幸いなことに、Unreal Engine には通常のほとんどの実装に向けたこのプロセスを効率よく実行する各種マクロが備わっています。簡単な実装ファイルを作成するには、以下の手順に従います。
- モジュールのルート ディレクトリに移動し、「
Private
」フォルダを開きます。このフォルダ内に「ModuleTestModule.cpp
」というファイルを新たに作成します。このクラス用に.h
ファイルを作成する必要はありません。
「<モジュール名>Module」は、Unreal Engine ソース コードにおけるモジュール実装ファイルの一般的な命名規則です。大規模なコードベースでは、これらのファイルを追跡する上で役立ちます。
- 「
ModuleTestModule.cpp
」に次のコードを追加します。
ModuleTestModule.cpp
#include "Modules/ModuleManager.h"
IMPLEMENT_MODULE(FDefaultModuleImpl, ModuleTest);
これによってモジュールのデフォルトの実装が提供され、C++ コードで使用できるようになります。
モジュールのクラス、コンストラクタ、そして Startup および Shutdown 関数を手動で作成することで、より詳細な実装を作成することができますが、ほとんどのゲームプレイ モジュールについては、モジュールのロード/アンロードを行う上でこのデフォルトの実装で十分です。
5. モジュールをコンパイルする
モジュールの定義と実装が完了したら、これをコンパイルするためのシンプルなプロセスを実行します。
- 「
MyProject.uproject
」を右クリックして [Generate Visual Studio Files (Visual Studio ファイルを生成)] をクリックし、IDE ソリューションを再生成します。
こうすることで、新しいモジュールが IDE および Unreal Editor 内で確実に表示されるようになります。
モジュールのコードを整理し直したり、「Build.cs
」ファイルの内容を変更したりした際は、最新の状態を保つために、必ず IDE ソリューションを再生成してください。
-
Visual Studio でプロジェクトをコンパイルします。その一環として新しいモジュールがコンパイルされます。
手動で新しいモジュールを追加した場合、モジュールのディレクトリ構造を変更した場合、C++ ファイルを移動したり名前変更したりした場合、またはモジュールの依存関係を変更した場合は、必ずプロジェクト ファイルを再生成して Visual Studio ソリューションを更新し、プロジェクトを再びコンパイルしてください。
Unreal Editor の実行中でもプロジェクトをコンパイルすることはできますが、場合によっては Unreal Editor を閉じて、大きな変更または新しいクラスのためにコンパイルした後に、変更を反映させるよう Unreal Editor を再起動しなければならないことがあります。
6. モジュールをプロジェクトに含める
モジュール自体はコンパイルできますが、モジュールからのコードをプロジェクト内で使用するには、これを .uproject file
に登録し、ゲームのプライマリ モジュール用に依存関係を作成する必要があります。
- 「
MyProject
」ルート ディレクトリを開いて「MyProject.uproject
」をテキスト エディタで開き、「Modules」リストを次のように編集します。
MyProject.uproject
"Modules": [
{
"Name":"MyProject",
"Type":"Runtime",
"LoadingPhase":"Default"
},
{
"Name":"ModuleTest",
"Type":"Runtime"
}
]
このリスト エントリを使用して、どの Loading Phase とその Type をロードするかを設定できます。この例はランタイム モジュールなので、プロジェクトがスタンドアローン アプリケーションとして実行されている場合や、エディタ内で実行されている場合にも使用することができます。
一方で、エディタ モジュールはエディタ内での実行のみが可能です。エディタ モジュールでは、ゲーム モジュールのロード後に初期化を行う Default ロード フェーズも使用します。モジュールの仕様によっては、より早期段階のロード フェーズを使用して、当該モジュールに依存する他のモジュールにより、未ロードのコードの検出に関連するエラーが生じないようにする必要がある場合があります。
- 「
MyProject/Source
」フォルダに移動して「MyProject.Build.cs
」ファイルを開きます。ModuleTest
をPublicDependencyModuleNames
のリストに追加します。以下のようになります。
MyProject.Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "ModuleTest" });
これで、モジュールからのコードをプライマリ ゲーム モジュールに含めることができるようになります。
7. コードをモジュールに追加する
C++ ファイルをモジュールの「Public
」および「Private
」ディレクトリに手動で追加するか、C++ ファイルを Unreal Editor に追加することができます。
以下は、新規クラス ウィザードを使ってコードをモジュールに追加するための手順です。
-
Unreal Editor でプロジェクトを開きます。
-
コンテンツ ブラウザで [Add (追加)] をクリックし、[New C++ Class (新規 C++ クラス)] をクリックします。
-
[Actor (アクタ)] を親クラスとして選択し、[Next (次へ)] をクリックします。
-
[Name (名前)] フィールドの隣にあるドロップダウンに移動します。デフォルトで「MyProject (Runtime)」と表示されているはずです。このドロップダウンをクリックし、[ModuleTest (Runtime)] に変更します。
選択肢として [MyModule (Runtime)] が表示されない場合は、前の各セクションを再確認し、それぞれの手順を正しく実行してください。
-
クラスに「ModuleActorBase」と名前を付け、[Class Type (クラス タイプ)] を [Public (パブリック)] に設定して、[Create Class (クラスを作成)] をクリックします。
クラスの
.h
および.cpp
ファイルが IDE でそれぞれ自動的に開きます。クラスの.cpp
ファイルはモジュールの「Private
」フォルダに追加され、.h
ファイルは「Public
」フォルダに追加されます。 -
「
ModuleActorBase.cpp
」を開き、次の行をAModuleActorBase::BeginPlay
関数に追加します。GEngine->AddOnScreenDebugMessage(0, 5.0f, FColor::Blue, TEXT("Hello, world!"));
-
コードを保存してモジュールをコンパイルします。
このクラスでは、ゲームの開始時にデバッグ メッセージを画面に出力するシンプルなアクタを定義します。これは、Unreal Editor の [Place Actors (アクタを配置)] ツールを使ってテストできます。
8. モジュールからのコードを拡張する
最後に、以下の手順に従って、新しいアクタ クラスと、プライマリ ゲーム モジュールでそれが表示されることをテストします。
-
Unreal Editor でプロジェクトを開きます。新しいブループリント クラス を作成し、[All Classes (すべてのクラス)] リストを展開します。
-
親クラスとして [ModuleActorBase] を選択し、ブループリント クラスに「ModuleActorBP」と名前を付けます。
-
ModuleActorBP のコピーをコンテンツ ブラウザからゲームのワールドにドラッグします。[Play (プレイ)] ボタンをクリックします。
クラスのリストに ModuleActorBase が表示されない場合は、そのヘッダが「Public
」フォルダ内にあること、それに BlueprintType UCLASS
指定子が含まれていること、そしてプロジェクトの依存関係に ModuleTest
モジュールが追加されていることを確認してください。
最終結果
[Play] をクリックすると、エディタ内でプロジェクトが実行され、デバッグ メッセージである「Hello, world!」が青色で画面に表示されます。このブループリントベースのアクタにより、別のゲームプレイ モジュールで定義されたクラスが拡張されて使用されます。これで、今後モジュールを作成するにあたり、ゲームプレイ特有のコード用に拡張可能なクラスを基盤として作成する準備が整いました。