AirSimをUnreal Engine, Visual Studio 2017でビルドする(Windows編)

## この記事では、以下に関して記載しています
* AirSimについて
* 事前準備の概要
* AirSimプラグインのビルド
* Unreal EngineのプロジェクトにAirSimを仕込む手順

# 1. AirSimについて

AirSimは、Unreal Engineで実装されたドローンや車のシミュレータです。
マイクロソフトが中心となってオープンソースで開発されています。
Unreal Engineのプラグインとして実装されているので、
比較的簡単にUnreal Engineのプロジェクトに組み込むことができます。

ソースコードやバイナリは、github上で公開されています。

https://github.com/Microsoft/AirSim

APIも公開されているので、外部アプリからドローンや車をコントロールしたり、
写真撮影したりもできます。

Windows向けにはビルド済みのバイナリも公開されていますが、
独自機能実装したり、APIでできること以上の挙動をカスタマイズしたり、
マップやオブジェクトのカスタマイズ等する場合は、
ビルド環境作る必要があります。

Windows環境で単に飛ばして試してみる場合は、以下を参照ください。

* [AirSimでドローンを飛ばして遊ぶ(ドローン持ってなくてもできる！)](https://qiita.com/thrzn41/items/c9b475e7a5cf43bfd58b)

# 2. 事前準備の概要

必要な環境は、Windowsか、Linuxかや、
AirSimのバージョンなどによっても異なります。

今回は、2018年05月24日現在でのWindowsでビルドする場合の、事前準備に関してです。
微妙に違っても、手探りでなんとかできるかもしれませんが、
以下の環境だとすんなりできました。

OSは、Windows 10 Pro 64ビット バージョン1803で試しました。

以下の事前準備でインストール済みでないものに関しては、
インストールしておきます。

## 2.1. Visual Studio 2017の準備

Visual Studio 2017の各種エディションで動作するはずです。

> 無償のVisual Studio Communityの利用条件に合致している場合は、
> Visual Studio Communityも利用可能だと思います。
> (※ ただし、手元の環境では、Visual Studio Communityでは未確認です。)

Visual Studio Installerでは、以下のワークロードやオプションを選んでおきます。
(新規インストール時、または、
インストール後で不足があれば、Visual Studio Installerを起動して、[更新]から追加インストール。)

* [モバイル&ゲーム]カテゴリから、[C++によるゲーム開発]
* 右側の[オプション]または、[個別のコンポーネント]タブから、[Windows 10 SDKのどれか]と[Windows 8.1 SDK]

> 必要なWindows SDKのバージョンは、Unreal Engineのバージョンによります。
> AirSimのプラグインをビルドするだけなら、最新バージョンでも多少設定変更だけでビルド可能ですが、
> Unreal Engine利用時に苦労すると思うので、
> 2018年05月24日時点では、Windows 8.1 SDKもインストールしておくのが無難です。

## 2.2. Unreal Engineの準備

**※ HDDに25GB程度の空き容量が必要になると思います。**

[Unreal Engineの公式サイト](https://www.unrealengine.com/)から、入手可能です。

[ここをクリック](https://www.unrealengine.com/)して、[ダウンロード]ボタンを探して、
ダウンロードします。
Epic Gamesアカウントを持っていない場合は、サインアップしてアカウントを作成します。

> 2018年05月24日時点では、Unreal Engineのエンドユーザライセンス同意は、
> 開発者にとってかなり自由度の高い(嬉しい)ものになっています。
> 基本的には無料で利用開始できます。
> Unreal Engineを利用したアプリを販売した場合、4半期ごとに3,000米ドルを超えた部分に対して、
> 支払い義務が発生します。

ダウンロードしたインストーラを起動して、指示に従ってインストールします。
インストール後には、[Epic Games Launcher]を起動して、[Epic Gamesアカウント]でログインします。

### 2.2.1 Unreal Engine 4.18のインストール

1. [Epic Games Launcher]の[UNREAL ENGINE]タブを選択します(たぶん選択されている)。
1. 左側のメニュから、[Library]を選択します。
1. [ENGINE VERSION]の右の[+]ボタンを押します。
1. [4.19.2]などの数字が出ていると思いますが、数字をクリックして、
[4.18.3]などの、[4.18.x]を選択します。
1. [Install]ボタンを押してインストールします。あとは指示に従ってインストールを進めます。

**※ 必要なUnreal Engineのバージョンは、AirSimのバージョンによります。**

準備できるとこんな感じ。

![UnrealEngineInstall.png](https://qiita-image-store.s3.amazonaws.com/0/211666/528bae4d-35dc-e8dc-3673-cf484f1818bf.png)


# 3. AirSimプラグインのビルド

これまでで、だいたいの準備は完了です。

[CMake](https://cmake.org/)、[rpclib](https://github.com/rpclib/rpclib)、[Eigen3](https://bitbucket.org/eigen/eigen)や各種モデルデータなども
必要となりますが、ビルド時にダウンロードされます。

> CMakeは、3.9以降を先にインストールして、
> インストーラでパスを通すようにオプション入れておくと、多少楽かもしれません。
> 以下は、CMakeがインストールされていない前提です。

多少スムーズに進むように公式の手順から少しだけ違う手順で進めます。

## 3.1. AirSimのソースコードの入手

まずは、ソースコードを入手しましょう。

GitHubのリポジトリは以下です。

https://github.com/Microsoft/AirSim

Git使っている人は、適当なディレクトリにクローンします(2018年05月24日現在、400MBくらい)。
(使ってない人は、[Clone and download] > [Download ZIP]でダウンロードして解凍とか。)

``` shell
command> git clone https://github.com/Microsoft/AirSim.git
```

## 3.2. CMakeの入手

公式手順だと、この時点でVisual Studioのコマンドプロンプトから、
`build.cmd`を実行することになっていますが、
手順的に手間になることがあるので、先にCMakeを入手しちゃいます。

既に、CMake 3.9以降がインストールされていてパスも通っていれば、
この手順は飛ばして構わないと思います。

先ほど、入手したAirSimのソースコードのディレクトリ(リポジトリ)内の
`check_cmake.bat`(OS設定によっては、拡張子ないはず)を実行します。
ダブルクリックでもいけるはず。

> ダブルクリックだとわかりずらいですが、
> すでにインストールしてパスが通っている場合は、
> "Found cmake version: x.y.z"と表示されるはずです。

``` shell
Press any key to download and install cmake (make sure to add it in path in install options)
```

と表示された場合は、何かキーを押します。

インストーラがダウンロードされて、起動するので指示に従ってインストールしますが、
**オプションでパスに追加するように設定**します。
[Add CMake to the system PATH to the current user]
などを選んでおきます。


## 3.3. ソリューションの再ターゲットを行う

入手したVisual Studioのツールセットのバージョン等が、
自分の環境にあっていない場合があるので、
再ターゲットしておきます。

入手したソースコードのディレクトリの、
Visual Studioソリューション`AirSim.sln`(環境によっては拡張子なし)を
ダブルクリックなどして、Visual Studioで開きます。

開いた時点で、[ソリューション操作の再ターゲット]ウィンドウが
表示された場合は、指示に従ってターゲットのツールセット等をアップグレードします。

その後、[ソリューションエクスプローラー]から、
[ソリューション'AirSim']を右クリックして[ソリューションの再ターゲット]から、
ソリューション全体の再ターゲットを行います。

![SolutionRetarget01.png](https://qiita-image-store.s3.amazonaws.com/0/211666/e5a787b8-2ceb-044b-d1d1-c5b3fce6427d.png)

Windows 10 SDKの最新のものなどに再ターゲットしておきます。

![SolutionRetarget02.png](https://qiita-image-store.s3.amazonaws.com/0/211666/61ca0315-6667-a32c-23f6-b94cf726b5ab.png)




## 3.4. プラグインをビルドする

通常、(いろいろ凝った設定をしていない場合は)、
[VS 2017 用 x64 Native Tools コマンド プロンプト]からビルドする必要があります。


STEP1. プログラム一覧などから、
[VS 2017 用 x64 Native Tools コマンド プロンプト]を探して起動します。


STEP2. AirSimのソースコードディレクトリに移動します。

``` shell
command> cd /d pathto\AirSim
```
`pathto\AirSim`がAirSimのソースコードのフルパスです。
`/d`オプションは、ドライブ変更までしない場合は不要です。


STEP3. あとは、`build.cmd`を実行。

``` shell
command> build.cmd
```

必要なライブラリやモデルデータ等がダウンロードされて、
ビルドも行われます。

**※ 環境によっては、ビルドが失敗すると思います。**

``` shell
#### Build failed - see messages above.
```

と表示されていた場合は、失敗しています。

Windowsが日本語版の場合は、デフォルトのコードページがMS932の場合、
Eigen3の、あるファイルの読み込みで問題が発生して失敗します。
試してませんが、`chcp 65001`などで、コードページをUTF-8に変更などでもいけるかもしれませんが、
後々、Visual Studioからビルドする場合などは、どのみち苦労しそうなので、
今回は問題が発生するファイルを修正します。

`build.cmd`実行時にダウンロードされたEngen3のソースコードファイルのうち以下を探します。
`AirLib/deps/eigen3/Eigen/src/Core/arch/CUDA/Half.h`
です。

2018年05月24日時点では、
このファイルの先頭付近のコメント中に、MS932として読み込もうとして問題が発生する文字が含まれています。

``` cpp
// “AS IS”
```
の部分の引用符の文字コードが該当箇所です。
Unicode的には、0x201cと0x201dのコード値の文字になります。

Byte Order Mark(BOM)付きのUTF-8で保存するなどで解決します。
または、引用符をASCIIコードの引用符に変更してもOKです(`"AS IS"`にする)。

変更した後に再度、`build.cmd`を実行するとうまくいくはずです。

ちょっと分かりづらいですが、

``` shell
#### Build failed - see messages above.`
```

と表示されずにコマンドが終了していれば、
たぶん成功しています。

上記をやっても失敗する場合は、個別にいろいろ頑張って調べるしかないかも。

# 4. Unreal EngineのプロジェクトにAirSimを仕込む手順

Unreal Engineには無償のサンプルがたくさんあるので、
これを使って組み込んでみます。

## 4.1. サンプルのプロジェクトを作成する

[Epic Games Launcher]の[UNREAL ENGINE]タブの左側のメニュにある、
[Learn]から各種サンプルが入手できます。

例えば、
[Landscape Mountains]のサンプルを選ぶと、[Free]というボタンがあって、
押すと入手できます。

**※ Landscape Mountainsの場合は、Debugでビルドした時点で、
プロジェクトのディレクトリは、中間ファイル含めて2.5GB程度になります。**

※AirSimはプラグインなので、Unreal Engine 4.18と互換性のあるサンプルなら、
なんでも大丈夫だと思いますが、
プレイヤーの位置調整やカメラワークの調整等が比較的簡単なので、
**最初に試す時点では、Landscape Mountainsがおススメです**。

[Create Project]でサンプルのプロジェクトを作成できます。
適当なディレクトリに、
[Select Version of the Engine for Project]では、[4.18]を選ぶと、
AirSimを仕込めるプロジェクトが作成できます。
コンテンツのダウンロード等に少し時間がかかると思います。


## 4.2. プロジェクトをビルドする

作成したプロジェクトのディレクトリに行くと、Unreal Engine Projectの
`ProjectName.uproject`(拡張子付きかはOS設定による)があるので、
ダブルクリックなどで、Unreal Editorで開きます。

Visual Studioのソリューションの作成とビルドをするために、いったん、空のC++ファイルを作っておきます。

Unreal Editorの[ファイル] > [新規C++クラス...]を選びます。
親クラスの選択では、[なし]を選択します。
[次へ]ボタンを押して、ファイル名はとりあえず適当でOKです。
[クラスを作成]でファイルが作成されます。

この時点で、Visual Studioのソリューションが作成されて、ビルドが開始されるはずです。
また、Visual Studioが起動すると思います。


## 4.3. プロジェクトにAirSimプラグインを仕込む

AirSimのディレクトリ内に、`Unreal`というディレクトリがあって、
その中に、`Plugins`というディレクトリがあるので、
`Plugins`ディレクトリごと、Unrealのプロジェクトディレクトリ内にコピーします。

`ProjectName.uproject`ファイルをテキストエディタなどで開いて編集します。

例えば、こんな感じになります。

``` json
{
	"FileVersion": 3,
	"EngineAssociation": "4.18",
	"Category": "Samples",
	"Description": "",
	"Modules": [
		{
			"Name": "LandscapeMountains",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
			  "AirSim"
			]
		}
	],
	"TargetPlatforms": [
		"MacNoEditor",
		"WindowsNoEditor"
	],
	"Plugins": [
		{
			"Name": "AirSim",
			"Enabled": true
		}
	],
	"EpicSampleNameHash": "1226740271"
}
```

追加したのは、以下の2か所になります。

``` json
,
"AdditionalDependencies": [
  "AirSim"
]
```
と

``` json
"Plugins": [
		{
			"Name": "AirSim",
			"Enabled": true
		}
	],
```
です。

JSON形式なので、形式に間違いがないかを確認して保存します。


## 4.4. Visual Studioプロジェクトファイルの生成とUnreal Editorの起動

ここで一旦、Visual StudioとUnreal Editorは閉じておきます。

Unreal Engineのサンプルプロジェクトのディレクトリ内で、
`ProjectName.uproject`を右クリックして、
[Generate Visual Studio project files]を選んで、プロジェクトファイルを生成します。

生成が完了後に、同じディレクトリ内のVisual Studioソリューション、
`ProjectName.sln`をダブルクリックなどして、Visual Studioで開きます。

[ソリューション構成]で、[Debug Game Editor]を選択しておきます。

![Debug.png](https://qiita-image-store.s3.amazonaws.com/0/211666/ec7005ec-d170-fe42-3b5a-96711c048aac.png)


これで、[F5]などでデバッグ開始すると、Unreal Editorが開きます。


## 4.5. Unreal Editor上で動かして遊ぶ

[ワールドセッティング]などからゲームモードを変更しておきます。
[ワールドセッティング]ウィンドウが表示されていない場合は、
[ウィンドウ] > [ワールドセッティング]を選んで表示させます。

[ワールドセッティング]の[GameMode Override]で、
[AirSimGameMode]を選びます。

**ここで、一旦、保存しましょう。**

Unreal Editorの上側にある、[プレイ]ボタンを押すと、動作するはずです。

![Play.png](https://qiita-image-store.s3.amazonaws.com/0/211666/db5c0b15-7ca0-43b1-cea5-4343c19a2d86.png)

これで、挙動カスタマイズしたり、新機能入れたりもできるようになります。