【UE4】C++で専用GameModeを作成してDefault値を変更する

# 最初に

この記事はUE C++を用いてGameModeを自作する方法の記事となります。間違いや更に良い方法があった場合にはそっとTwitter( [@ろっさむ](https://twitter.com/4_mio_11) )やコメント、修正リクエストなどでお知らせ頂けるととても有難いです。



## 作業環境

記事内で使用する作業環境は以下の通りとなります。

- Unreal Engine：4.23
- Visual Studio：Community 2017 or Community 2017 for Mac or Enterprise 2019



# GameModeの作り方

通常のGameModeはマルチプレイでの対戦ゲーム制作に適した機能が多く含まれていますが、それ以外のジャンル（例えば一人用アクションゲームなど）の場合には、GameModeBaseから継承した自作用のGameModeを作る方が余計な機能を省いてクリーンにカスタマイズを行うことができます。



`新規追加 > 新規C++クラス`から「全てのクラスを表示」にチェックマークをつけ、検索ボックスから`GameModeBase`を入力し選択して「次へ」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/efd5382f-2486-013f-bde4-2c4602608b4f.png)




新規クラスに`任意の名前+GameMode`と名前を付け任意のフォルダ下にクラスを作成します。

ここで、クラスをパブリックにするかプライベートにするか選択ができますが、これはモジュールの外側にクラスを公開するか否かという選択になります。UEアプリは1つのモジュールで構成されるため、基本的にはプライベートとするのがよいでしょう。
TODO : 検証（プラグインは自身のアプリとは別のモジュールであり、基本パブリックなクラスで構成されています。プラグイン導入時にはそのままプラグインが持つパブリックなクラスの導入が必要となります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/198e55ed-a405-eccb-8cd8-fd95eb7098ca.png)


これだけでカスタマイズ用のGameModeクラスが作成できました。また、プロジェクト専用のベースクラスを作成することで後々柔軟に拡張やバグ対応を行うことができます。

# 自作GameModeの適用

次に`設定 > ワールドセッティング`を押下し、ワールドセッティングタブを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/7de15c7c-f7a0-9f6f-417a-51437800487a.png)


タブ内の`GameMode`にて`GameMode Override`という項目があるので、そこを自作したGameModeへ変更します。今回は先ほど作成したBaseクラスを更に継承した`CPP_StartGameMode`というクラスを作成し、ここに設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/5dc2d8b9-f248-aa7b-0eae-dfb56f9a1796.png)




# 初期セッティングをC++で行う

これだけでは味気ないので、最低限の設定でC++側から`ThridPerson`のキャラクターBPである`ThirdPersonCharacter`を`Default Pawn Class`に設定して動かしてみましょう。

尚、C++でキャラクタークラスから作成してSpawnまでする場合の手順は以下の記事にまとめてあります。

// TODO:　これからまとめる

## Axis Mappingsを設定する

まずはヘッダーメニューの`Edit`から`Project Settings...`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/6d5163b1-c20e-23a1-2952-fc53ada7af82.png)


次に`Engine > Input`を開いて`Axis Mappings`という項目を探します。ここで、以下の画像のように`MoveX`と`MoveY`を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/bbf87b58-92a5-841a-69c4-a8d73d03ed56.png)



次に、`ThirdPersonCharacter`というBPを開き、`InputAxis MoveForward`を`InputAxis MoveY`に、`Input Axis MoveRight`を`InputAxis MoveX`に置き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/26101e18-6e88-9669-8a11-3ce8a0a88762.png)


ここまで出来たら次にC++側から、この`ThirdPersonCharacter`を`Default Pawn Class`に設定するよう変更してみます。



## C++からDefaultPawnClassを設定する

GameModeにおけるDefault値はコンストラクタで設定するのが良いでしょう。

```c++
ACPP_StartGameMode::ACPP_StartGameMode()
	:Super()
{
    // パスの最後には`_c`をつけるよう注意してください。
	FString Path = "/Game/ThirdPersonBP/Blueprints/ThirdPersonCharacter.ThirdPersonCharacter_c";
	ConstructorHelpers::FObjectFinder<UClass> CharacterBP(*Path);
	TSubclassOf<AActor> ThirdPersonCharacter = CharacterBP.Object;

	if (ThirdPersonCharacter != nullptr)
    {
		DefaultPawnClass = ThirdPersonCharacter;
	}
}
```

このコードを記述して実行すると、ワールドセッティングタブ内の`Selected GameMode > Default Pawn Class`が`ThirdPersonCharacter`になっていることが確認できると思います。これでステージ内に`Player Start`を設置することで`ThirdPersonCharacter`が`Spawn`されることと思います。