Amazon GameLiftをUE4で使用してみた(SeverSDKビルド～プラグインビルドまで)

[Unreal Engine 4 (UE4) Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4) 5日目の記事になります。

2017年2月に[Amazon GameLift Unreal Plugin](https://www.unrealengine.com/marketplace/amazon-gamelift-unreal-plugin)がマケプレに登場しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/3f1512c6-fcb6-ee8e-0a7b-8369d5d330a1.png)

購入ボタンがAWSへのリンクになっており、[AmazonのGameLift](https://aws.amazon.com/jp/gamelift/getting-started/?sc_channel=el&sc_campaign=unrealmarketplace_amazongameliftsdk_2017&sc_publisher=epicgames&sc_country=mult&sc_geo=mult&sc_category=amazongamelift&sc_outcome=other)サイトでSDKをダウンロードし、中にあるUE4のプラグインファイルをプロジェクトに移行して使うという形式になっています。

今年の11月あたりに興味本位でAmazon GameLiftを触ってみたところ、まさかのSDK本体のコンパイルが必須、クライアントSDKはUnrealEngine対応のプラグインがそもそも用意されていないため、C++ソースからUnrealC++への変換が必要かもしれない等、初めて扱う人をある程度振るい落とす導入難易度の高さを知り、驚きました。

~~なぜマケプレに出した。UE4はサーバってことなのか?~~

ドキュメントもC++触ってない人間だと「何だこれ、マジヤバくね」と思うほど不親切な部分もちらほらあったので、今回はドキュメントに掲載されているGameLiftのSeverSDKのビルドからUE4プラグインビルドまで書いていきます。

検証として使用した環境とSDKは以下の通りです。

OS:Windows10
UnrewalEngine:4.18.1
Amazon GameLift SDK:3.1.7

※実際の利用方法について検証に時間がかかっています。中途半端に記事を出してしまい申し訳ございません。
※動作を確認次第、その２として書いて公開します。

# Amazon GameLift を Unreal Engine ゲームサーバープロジェクトに追加

まずUnreal Engine Server SDK プラグインをUE4プロジェクトに使用できるようにするため、プラグインをUE4でビルドできる段階まで行います。
[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/gamelift/latest/developerguide/integration-engines-setup-unreal.html)を参考に、SDKのダウンロードはあらかじめ済ませてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7c0710f0-c387-6ebe-32a3-4a1ab22ec2f7.png)
ダウンロードしたzipファイルを解凍して、フォルダを開いた段階です。
本来であれば下の「GameLift-Unreal-plugin-3.1.7」フォルダの中身をUE4のプロジェクトに持っていって、プラグインをビルドをするだけなのですが、なんとAmazon側のAPIを参照するためのdll等が無いせいで、いくら頑張ろうがAmazonのAPIに繋げられないという、ドキュメント読まない人間を殺すトラップが潜んでいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/48a87fa9-e0f2-ab06-32cb-8db5ee9815eb.png)

UE4側はバージョン変わるごとにプラグインが使えなくなるので、まだプラグインソースをビルドすることは理解できますが、SDK自体も何故初回からビルドが必要なのか正直疑問です。
ここはUE4のバージョンには全く関係ないですし。

こんなことを言っても改善されるかわからないので、早速SDKのビルドを行います。

## CMakeインストール

まずSDKをビルドするには[CMake](https://cmake.org/)と[MSBuild](https://msdn.microsoft.com/ja-jp/library/dd393574.aspx)が必要です。
先にCMakeのインストールを行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7f86af23-306e-77ad-3652-b0abf41bf7b2.png)
Downloadから適切なプラットフォームのインストーラーをダウンロードしましょう。
今回はWindows10で検証しているため、Windows64bit版をダウンロードしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/3f221388-8e40-10b2-3f9d-01c2a90cd208.png)
ダウンロードされるのはGUIベースのモノですが、dllのコンパイルに限り、コマンドプロンプトを叩いてビルドしたほうが精神衛生上楽です。（GUIの設定がよくわからなかったというのもあります）
上記理由からコマンドプロンプトを叩くので、画像の通りインストーラーでPath設定をしておくと楽です。

ダウンロードが終わったらコマンドプロンプトで確認します。
![cp.png](https://qiita-image-store.s3.amazonaws.com/0/104377/e78bb7f0-6662-edbf-ccfa-cf449bdd29a9.png)
cmake --versionを入力後エンターキーを押し、バージョンが表示されれば無事Path設定も終わってます。

## MSBuildインストール

続いてMSBuildのインストールです。
こちらはVisual Studioをインストールすればほぼ自動的についてきます。

もし、Visual Studioをインストールしていない場合、[公式からインストール](https://www.microsoft.com/ja-jp/dev/default.aspx)してください。

Visual Studioインストール済みの場合、以下の場所にMSBuild用のコマンドプロンプトがあります。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools
※Visual Studio2015の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/27e6c2b6-191a-12df-7e24-2f47f26910a1.png)


ビルドにはこのMSBuild用のコマンドプロンプトを使用します。

## SDKビルド

つづいて、SDKのビルドです。
MSBuild用のコマンドプロンプトを起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/feb7ec11-14ba-cac2-4ed4-2a7407c54d44.png)

続いて、CDコマンドでGameLift-Cpp-ServerSDK-3.1.7フォルダまで移動します。
以下の画像はコマンド例となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/3a684a61-3fd0-b8c5-ac77-108e426ca57b.png)

大体cdと入力後、フォルダパスをコピペすればできると思います。

つづいて、出力用のフォルダを作成します。
ドキュメントに従い、以下のコマンドを実行します。
```
mkdir out
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c0570731-816d-c319-2e8f-192c07d7b5f3.png)

コマンドを実行するとoutフォルダが作られます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/2c29a47b-1896-752e-305e-12186149a010.png)

続いて作成したoutフォルダに移動します。
```
cd out
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/dda3cc2f-ec35-8082-db7a-4b5eb8c9112a.png)

これでoutフォルダに移動しました。
続いて以下のコマンドを実行します。
```
cmake -G "Visual Studio 14 2015 Win64" -DBUILD_FOR_UNREAL=1 ..
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8e9e086d-699a-1748-7d06-59620e749200.png)

このコマンドを実行すると、SDKビルドに必要なUnrealEngine用のプロジェクトが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/57f0c2dc-fb43-1d01-cf98-60382ccc416d.png)

最後に以下のコマンドを実行します。
```
msbuild ALL_BUILD.vcxproj /p:Configuration=Release
```

コマンドを実行すると、以下の画像の通りビルドが走ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b44ba03e-1f07-10ef-aaca-60dda6e18f60.png)

ビルド完了までは時間がかかるのでのんびりと待ちましょう。
エラーが無ければ無事ビルド完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a1c848c1-e3ae-3e9a-2df0-a086a92d3d56.png)

最後に以下のファイルが作成されているかを確認します。

out\prefix\bin\aws-cpp-sdk-gamelift-server.dll
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/18b98d64-c314-2559-b842-acf5ef5e98bb.png)

out\prefix\lib\aws-cpp-sdk-gamelift-server.lib
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/ef30af93-6736-d7af-3aaa-ba18dc534957.png)

作成されていない場合はエラーが発生してしまっているため、エラーメッセージをみて解消しましょう。

## プラグインビルド

ようやくUE4プロジェクトにてプラグインのビルドに入ります。
SDKフォルダにあるGameLift-Unreal-plugin-3.1.7フォルダを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/33451625-2b6f-d6f9-1577-c88ac9fa3b2d.png)

作成したaws-cpp-sdk-gamelift-server.dllとaws-cpp-sdk-gamelift-server.libを以下の場所に配置します。

..\GameLift-Unreal-plugin-3.1.7\GameLiftServerSDK\ThirdParty\GameLiftServerSDK\Win64
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/85aa1921-5dcc-3260-08b3-61de7720a0e5.png)

これで無事にプラグインソースの完成です。

UE4でプラグインソースをビルドする場合はalweiさんの「[UE4 プラグインを自分でビルドしてみる](http://unrealengine.hatenablog.com/entry/2015/05/20/220000)」を参考にしてください。

※BluePrintのみの場合は、一度適当にC++クラスを作る必要があります

プロジェクトフォルダにPluginsという名前のフォルダを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/73ee83d1-7111-5bce-b65a-a229f61cf5ac.png)

GameLift-Unreal-plugin-3.1.7フォルダの直下にあるGameLiftServerSDKフォルダを、Pluginsフォルダにコピペします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c06cfdc2-c38e-b56f-da09-66dded8512ae.png)

続いてuprojectフォルダをテキストエディタで開き、以下の画像の通りPluginsの記述を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/2fdd54a1-0eed-901a-7a62-fc447cc6c215.png)


```
"Plugins": [
	{
		"Name": "GameLiftServerSDK",
		"Enabled": true
	}
]
```

これでプラグインのビルドが走ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b706e436-17a8-15b1-0fae-95283da5586d.png)

無事エラー無くプロジェクトが起動し、プラグインを開いてチェックが入っていればプラグインビルドは完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/984e47aa-0cbe-dddd-d6e9-4505ccca378d.png)

最後にBuild.csにGameLiftSDKを使用する記述を追加して終了です。

```
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameLiftServerSDK" });
```

以下の画像は「GameLiftTest」という名前でプロジェクトを作成した時の記述例です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/ac60cef2-6185-eb6a-6b9e-c694f86688fe.png)

Pluginsのフォルダをプロジェクトに反映するため、uprojectを右クリックし、Generate Visual Studio project filesを選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8982d4bf-673a-fabf-678c-69d0f0d78078.png)

これでようやく準備完了です。
やっとスタート地点に立てました。長かった……。

#おまけ Amazon GameLiftとUE4のクライアント、サーバー連携を即時試したい方へ

Amazon GameLiftとUE4の連携を即効で試したい方がいらっしゃれば、$199で素晴らしいサンプルを売っている方がいらっしゃいます。

[Integrate Amazon GameLift](https://ue4plugin.wordpress.com/2017/06/02/integrate-amazon-gamelift/)

~~AWSのドキュメント通りにやったら設定だけでも時間を無駄に浪費する上にGameLiftnに接続できないストレスでハゲそうなので~~自分も購入して中身を見ましたが、改めてGameLiftのクライアントはLumberyardのみを想定したつくりになってるなーと実感しました。

# プラグインビルドまでの個人的感想

どうしてもAWSを使わないといけないという場合を除き、GameLiftに似た他社のサービスを使ったほうがいいと思います。

~~というか、デフォルトで用意されているマルチプレイネットワーク機能を使用して似たようなもの作ったほうが楽なんじゃないかなと5日間触って思いました~~

まずUE4向けのプラグインを作成するハードルが高すぎます。
ドキュメント、SDKもサーバー向けにしか準備されていないため、クライアントに対応させるにはGameLift APIとUnrealC++の知識も必須です。

Amazon GameLiftはLumberyard以外、利用するには割と上級者向けなんじゃないかなと触ってて思いました。

---

とはいえ、ここまでやった以上UE4のみでGameLiftを使用したい気持ちもあるので、サンプルを見ながら、GameLiftへサーバービルドしたファイルの接続、クライアントプラグインも作ってみたいと思います。

明日はtamfoiさんによる「なるべく手軽に壁走りを実装してみる」です！
壁走り実装してみたいですね！　楽しみです。