一つの UE4 プロジェクトで複数のゲームモジュールを扱う

# ゲームモジュールとは？
UE4 は様々な機能を **「モジュール」** という単位で分割、管理しています。
プラグインもこのモジュールの一種としてロードされています。

どのようなモジュールがロードされているのか？は、エディタの「Window > Developer Tools > Modules」で確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/25fc69fa-9dde-d92c-49bb-fa5c0ef6b23d.png)

ゲームモジュールとは**「ゲーム実装部をモジュール化したもの」**で、C++ で作られた UE4 プロジェクトは最低１つのゲームモジュールを持ちます。

特に理由がなければゲームモジュールは１つでも構いません。
ただし、ゲームモジュールを複数用意すれば・・・

* リンク時間が向上されるかも？
* エディタ拡張部分をスタンドアローン版から切り離せる。

などのメリットもあります。

# 複数のゲームモジュールを持つ UE4 プロジェクトを作ってみる
では、試しにゲームモジュールが複数存在する UE4 プロジェクトを作ってみます。
今回説明する手順は・・・

* UE4Samples という UE4 プロジェクトを作る。
* そこに LocalizationSample というゲームモジュールを追加する。

となります。

※ここに載せるファイルパスは全て UE4 プロジェクトディレクトリ相対です。

## UE4 プロジェクトとファイル、フォルダの用意
まず、UE4Samples という名前の UE4 プロジェクトを C++ テンプレートで新規作成します。
UE4 プロジェクトを作ったら、Source フォルダに LocalizationSample フォルダを作ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/53b50191-9e73-cb39-28e1-b1f17aa6b6c7.png)
　
フォルダを作ったら、Source/UE4Samples フォルダ内の以下で選択している3つのファイル・・・
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/33c20864-9673-7a7e-33ea-5ba8af483176.png)  
これらを Source/LocalizationSample フォルダにコピーして、以下のようにリネームします。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/b759dd81-739c-73a8-e877-c4b0794599be.png)

## ～.Build.cs の書き換え
Source/LocalizationSample/LocalizationSample.Build.cs を開いて、クラス名「UE4Samples」を「LocalizationSample」にリネームします。
（クラス名だけでなく、コンストラクタもリネームするのをお忘れなく。）

これで LocalizationSample モジュールのビルドルール（依存するモジュールの設定や、最適化の有無、RTTI の有無など）が定義できるようになります。
  
## LocalizationSample.cpp の書き換え
Source/LocalizationSample/LocalizationSample.cpp を開き、以下の記述・・・   

```cpp:
#include "UE4Samples.h"

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, UE4Samples, "UE4Samples" );
```

これを以下のように変更します。  

```cpp:
#include "LocalizationSample.h"

IMPLEMENT_GAME_MODULE( FDefaultGameModuleImpl, LocalizationSample );
```

**IMPLEMENT_PRIMARY_GAME_MODULE** を指定できるゲームモジュールは、UE4 プロジェクトの中で一つだけです。
それ以外のゲームモジュールはすべて **IMPLEMENT_GAME_MODULE** で指定することになります。

## ～.Target.cs の書き換え　

* Source/UE4Samples.Target.cs
* Source/UE4SamplesEditor.Target.cs

この２つのファイルを開き、以下の記述・・・  

```cpp:
OutExtraModuleNames.AddRange( new string[] { "UE4Samples" } );
```

これを以下のように変更します。

```cpp:
OutExtraModuleNames.AddRange( new string[] { "UE4Samples", "LocalizationSample" } );
```

Source/UE4Samples.Target.cs を書き換えると、ビルド構成・・・

* DebugGame
* Development
* Shipping

で、Source/UE4SamplesEditor.Target.cs を書き換えると、ビルド構成・・・

* DebugGame Editor
* Development Editor

でビルドされるようになります。

## ～.uproject の書き換え

UE4Samples.uproject を開き、以下の記述・・・

```:
	"Modules": [
		{
			"Name": "UE4Samples",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
```

これを以下のように書き換えます。

```:
	"Modules": [
		{
			"Name": "UE4Samples",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
		{
			"Name": "LocalizationSample",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
	]
```

これで UE4Samples をエディタで開いたり、実行したりする際に LocalizationSample モジュールが読み込まれるようになります。

## ビルド
UE4Samples.uproject の右クリックメニューから「Generate Visual Studio project files」を選択して、Visual Studio プロジェクトファイルを作り直します。

終わったら、作りなおされた UE4Samples.sln を開いて、Development Editor | Win64 でビルドしてください。
ビルドが終わったら、Binaries/Win64 に以下の4つのファイルが出力されていることを確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/318db092-8bf2-6450-bcb7-2e332ae84a0a.png)


## 実行確認
最後に UE4Samples.uproject を起動して、「Window > Developer Tools > Modules」から

* UE4Samples
* LocalizationSample

の2つのモジュールが読み込まれていることを確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/26eca85e-e5ed-e083-4b28-b79078b7ed5e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/43814/93aa5dfd-bbfd-6e1e-7177-29af0e79a2cf.png)

# 参考サイト

* Gameplay モジュール  
https://docs.unrealengine.com/latest/JPN/Programming/Modules/Gameplay/index.html