UE4でVisual Studioの代わりにJetbrains CLionと連携する

# はじめに

[Unreal Engine 4 (UE4) その2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4second) 3日目です。

私は以前から[IntelliJ IDEA](https://www.jetbrains.com/idea/)でJavaやScalaを書いていて、Unityが姉妹品の[Rider](https://www.jetbrains.com/rider/)に対応してぐぬぬと思っていたところにUE4も[CLion](https://www.jetbrains.com/clion/)と連携するプラグインの[dotBunny/CLionSourceCodeAccess](https://github.com/dotBunny/CLionSourceCodeAccess)があったので試してみました。
このプラグインを作ったMatthew DaveyはUnity5.5以前のバージョンでVSCode連携するエディター拡張[dotBunny/VSCode](https://github.com/dotBunny/VSCode)を作った人でもあります。

# CLionとは

JetBrainsが提供するC / C++向けのIDEでWindows、Mac、Linuxで動きます。
姉妹品にIntelliJ IDEAやRider、Android Studioがあり、CLionも同じような使い勝手です。
丁度、11月28日にCLion 2017.3がリリースされてこの記事を書くにあたってタイミングも良いです。

そしてUE4とCLionを連携してできることは

* UE4EditorからCLionでC++のソースを開く
* CLionからビルドしてHot Reloadする

逆にできないことは

* CLionからゲームを実行
* CLionからゲームをステップ実行などのデバッグ

最後に微妙なところとして

* 規模が大きくなると遅くなる
* 型の解析が不十分でエラー判定される事がある

といった所で常用するにしても軽く使うにしても微妙で今後に期待です。
ですがLinuxにはリファクタリングできるIDEは少ないので導入する価値は大いにありそうです。

# 導入

## MSYS2のインストール(Windowsの場合)

Windowsの場合、MSYS2でいくつかパッケージの導入が必要です。
これはCLionが使うビルドツールのcmakeのために必要なものです。

まずは [MSYS2 instlaler](http://www.msys2.org)から`x86_64`のインストーラーをダウンロードしてサイトの説明通りにインストールします。
次にMSYS2のターミナルを開き、以下のコマンドを実行するとCLionで使うパッケージをインストールできます。

```
pacman -Sy mingw64/mingw-w64-x86_64-gcc mingw64/mingw-w64-x86_64-clang mingw64/mingw-w64-x86_64-make
```

![msys2-pacman.png](https://qiita-image-store.s3.amazonaws.com/0/8995/e81d6a08-e22d-a113-b451-14ba6bfc454a.png)

## CLionのインストール

[Download CLion](https://www.jetbrains.com/clion/download/)からお使いのOSに合わせたインストーラをダウンロードしてインストールします。
Windowsならexeもしくはzip、Macならdmg、Linuxならtar.gzなので特に迷うことはないと思います。

## CLionの設定

MSYS2からインストールしたツールをCLionの`Settings` > `Build, Execution, Deployment` > `Toolchain`から登録します。`Name`に適当な名前、`Environment`から`MinGW`を選択、その隣にmingw64のパスを入力すれば他の項目は自動検出されます。

![clion-settings.png](https://qiita-image-store.s3.amazonaws.com/0/8995/12de936e-8aba-5b27-6efe-de0b7995e27b.png)

![clion-toolchains.png](https://qiita-image-store.s3.amazonaws.com/0/8995/7d9eda3e-7a16-8dc1-e8fa-54f7fe831945.png)

次に`Plugins`の`Browse repositories...`ボタンをクリックして出てきた画面で`unreal`を検索して出てくる`Unreal Engine 4 SDK Support`プラグインをインストールして `Restart CLion` ボタンを押して再起動します。
このプラグインを導入するとUnreal C++特有の`UPROPERTY`などで補完できるようになります。

![clion-plugins.png](https://qiita-image-store.s3.amazonaws.com/0/8995/6ef5054a-cfee-712a-b266-243f73cf8ee4.png)

![clion-ue4-plugin.png](https://qiita-image-store.s3.amazonaws.com/0/8995/e9a3ecd8-703d-aab4-0660-ef38c373b227.png)

![clion-restart.png](https://qiita-image-store.s3.amazonaws.com/0/8995/c4c6868b-8e58-3752-4544-dc647e22cc79.png)

## CLionSourceCodeAccessのインストール

CLionSourceCodeAccessをインストールする手段は2つあり、1つはマーケットプレイスでもう1つはGitHubです。UE4のバージョン毎にダウンロード先が異なるので一覧にしました。

| UE4のバージョン | ダウンロード先 |
|----|----|
| 4.15 | [GitHubのソース](https://github.com/dotBunny/CLionSourceCodeAccess/releases/tag/4.15) |
| 4.16 | [GitHubのソース](https://github.com/dotBunny/CLionSourceCodeAccess/releases/tag/4.16)もしくは[マーケットプレイス](https://www.unrealengine.com/marketplace/clion-integration) |
| 4.17 | [GitHubのmasterブランチのソース](https://github.com/dotBunny/CLionSourceCodeAccess/archive/master.zip)もしくは[マーケットプレイス](https://www.unrealengine.com/marketplace/clion-integration) |
| 4.18 | [GitHubの4.18ブランチのソース](https://github.com/dotBunny/CLionSourceCodeAccess/archive/4.18.zip) |

4.17対応版は細かいバグ修正やちょっとした使い勝手を改良したPull Requestを取り込んでもらったのでGitHubのmasterブランチのソースから導入するのがおすすめです。

GitHubのソースを利用する場合はプロジェクトフォルダに`Plugins`フォルダを作り、その中に`CLionSourceCodeAccess`を展開します。
プロジェクトフォルダ名が`MyProject`なら以下のようなフォルダ構成になります。

![ue4-plugin-folder.png](https://qiita-image-store.s3.amazonaws.com/0/8995/71063777-1300-dfb3-a611-0c4c272969db.png)

## UE4の設定

まずは `Edit` > `Plugins` を開き、一番下の `Project` > `Programming` にある `CLion Integration` プラグインを有効にしてUE4を再起動します。

![ue4-plugins.png](https://qiita-image-store.s3.amazonaws.com/0/8995/807e61fd-6dc7-0cca-3b10-6754dfd1eaf7.png)


次に `Edit` > `Editor Preferences...` を開き `General` > `Source Code` の `Source Code Editor` を `CLion` に切り替えます。

![ue4-source-code-editor.png](https://qiita-image-store.s3.amazonaws.com/0/8995/80c8eef8-8167-be20-d4a3-0d6340e73ac0.png)


最後に `Edit` > `Project Settings...` を開き `Plugins` > `CLion` の `C Compiler` と `C++ Compiler` と `CLion Executable` に次の表の値を設定します。

| 項目 | 値 | 補足 |
|----|----|----|
| C Compiler | C:/msys64/mingw64/bin/clang.exe | MSYS2でインストールした`clang`のパス |
| C++ Compiler | C:/msys64/mingw64/bin/clang++.exe | MSYS2でインストールした`clang++`のパス |
| CLion Executable | clion64.exeのパス | インストーラでインストールすると `C:\Program Files\JetBrains\` にあります |
 
`CMake Target Configurations` と `CMake Target Project` はVisual Studioの構成マネージャーと同じものです。
開発中はデフォルトのままで大丈夫です。

`Mono Executable` はWindowsでは使わないので空白のままで構いませんが、MacとLinuxでは `mono.exe` のパスを設定してください。

![ue4-clion-setting.png](https://qiita-image-store.s3.amazonaws.com/0/8995/c0e7129c-02dc-4a05-9bd2-44d0c3f8e5dc.png)

# 使い方

## CLionを開く

1. まずはUE4のメニューの `File` > `Generate CMakeList` で `CMakeLists.txt` を生成します。
2. 次にその下の `Open CLion` から `CLion` を起動できます。

![ue4-menu.png](https://qiita-image-store.s3.amazonaws.com/0/8995/1eea6ea1-e894-ae42-9c6e-1066de86874f.png)

プロジェクトを開いたときはシンボルの解析でしばらく負荷がかかるので画面下のプログレスバーがいっぱいになって消えるまで待ってください。

## 新規C++クラス作成時にCLionを開く

プラグインが有効ならば新規C++クラス作成時に `CLion` が起動されます。
ただし、**UE4.17にGitHubのソースから導入したもの以外**はソースのパスに空白が含まれているとうまく開けません。それが分かった時のお気持ちです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">せっかくWindowsがDocuments and Settingsみたいなスペースが入ってるパスをやめたのに他のアプリでプロジェクトフォルダにスペース入れるのやめてほしい</p>&mdash; Mitsuhiro Koga (@shiena) <a href="https://twitter.com/shiena/status/926184334179966978?ref_src=twsrc%5Etfw">2017年11月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

デフォルトの`Unreal Projects`フォルダめ…
仕方ないのでプロジェクトフォルダを空白を含まないパスに移してください。

## CLionからビルドする

画面右上のセレクトボックスを `MyProjectEditor-Development` に切り替えて左のボタンを押すとビルドが始まり、完了するとUE4側に`Hot Reload Complete`がポップアップします。

![clion-build.png](https://qiita-image-store.s3.amazonaws.com/0/8995/de68294e-783a-a5d5-6ec1-f2ebf51577a5.png)

# その他

## CLionのバグっぽいやつ

以下の画面はC++のFirst Personテンプレートの`MyProjectCharacter.cpp`を開いたもので数カ所、赤でエラーになっています。どうやら`BindAction`の最後の引数に親クラス名でメソッドを指定するとダメらしいのです。
CLionのBTSでエラーメッセージの[`No matching function` で検索](https://youtrack.jetbrains.com/issues?q=tag:%20CPP%20"No%20matching%20function")するといくつか見付かるのでそのうちの1つなんでしょう。

![clion-error.png](https://qiita-image-store.s3.amazonaws.com/0/8995/3a490d79-10d4-2be4-8ff5-c0a16efb071d.png)

## Windowsのデバッガ

同じくBTSの[CPP-8677 Support native MSVC debugger](https://youtrack.jetbrains.com/issue/CPP-8677)で
> No news yet, might come in mid/late 2018

とコメントされているのでデバッグできるのはまだ先のようです。

## UE4.19以降

[EpicGames/UnrealEngine#4142, Add project generation arguments in SourceCodeAccessors, CLion support to UBT, and a built-in version of the CLionSourceCodeAccessor](https://github.com/EpicGames/UnrealEngine/pull/4142) でGitHub上でPull Requestが出されて[中の人のコメント](https://github.com/EpicGames/UnrealEngine/pull/4142#issuecomment-347919102)で
> I'm in the process of merging this over. I did some updates to match our coding standard and fixed a bug in OpenSolutionAtPath() that had its return logic reversed.

と返信があるのでほぼ本体に取り込まれそうです。

ちなみにそのコメントの[少し上](https://github.com/EpicGames/UnrealEngine/pull/4142#issuecomment-340814290)で
> There some great work being done for detection on Windows, will get that included this week.

とか言っていますが、これは私が[dotBunny/CLionSourceCodeAccess](https://github.com/dotBunny/CLionSourceCodeAccess)に[Pull Requestしたもの](https://github.com/dotBunny/CLionSourceCodeAccess/pulls?q=is%3Apr+is%3Aclosed+author%3Ashiena)だったりします。一言くらい由来を書いてくれたらいいのに…

# まとめ

JetBrainsのIDE好きな私としては至極残念！
ソース解析間違いが解消されてデバッグできるようになったらまた使ってみたいです。

# 記事中のリンク

* CLion関連
    * [JetBrains CLion](https://www.jetbrains.com/clion/)
    * [tag:CPP "No matching function"|YouTrack](https://youtrack.jetbrains.com/issues?q=tag:%20CPP%20"No%20matching%20function")
    * [CPP-8677 Support native MSVC debugger](https://youtrack.jetbrains.com/issue/CPP-8677)
* CLion Integration関連
    * [dotBunny/CLionSourceCodeAccess](https://github.com/dotBunny/CLionSourceCodeAccess)
	* [マーケットプレイスのCLion Integration](https://www.unrealengine.com/marketplace/clion-integration)
    * [EpicGames/UnrealEngine#4142, Add project generation arguments in SourceCodeAccessors, CLion support to UBT, and a built-in version of the CLionSourceCodeAccessor](https://github.com/EpicGames/UnrealEngine/pull/4142)
* その他
	* [IntelliJ IDEA](https://www.jetbrains.com/idea/)
    * [Rider](https://www.jetbrains.com/rider/)
    * [dotBunny/VSCode](https://github.com/dotBunny/VSCode)
	* [MSYS2 instlaler](http://www.msys2.org)