【UE4】AIのExample Projectを作ってみました（フォルダ構造編）

#はじめに
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">プロジェクトはこんな感じになりました。<a href="https://twitter.com/hashtag/EpicFriday?src=hash&amp;ref_src=twsrc%5Etfw">#EpicFriday</a> <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/x6bpZ75Zvn">pic.twitter.com/x6bpZ75Zvn</a></p>&mdash; PavilionDV7 (@Dv7Pavilion) <a href="https://twitter.com/Dv7Pavilion/status/949269313432600577?ref_src=twsrc%5Etfw">2018年1月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動画が見れない方は[こちら](https://twitter.com/Dv7Pavilion/status/949269313432600577)

昨年の11月、12月に
[【UE4】AISense_Sightの視線チェックを改良する](https://qiita.com/Dv7Pavilion/items/730a853b30dcd1eae199)
[【UE4】異音を聞いた時のAIの振る舞いを良い感じにしてみた](https://qiita.com/Dv7Pavilion/items/55db413970ef0746dbf9)
このような記事を書きました。以前には「[【UE4】AI Perception の紹介と使い方](https://qiita.com/Dv7Pavilion/items/741402f4da609ec595a2)」といった記事も書いていたので「いっちょこれらの機能を一纏めにしたサンプルプロジェクト作るかぁ」と思い立ったので作ってみました。*（丁度Watch Dogsをプレイしていたこともあって「ある程度は再現できそうだな」と思ったのもあります）*

作ったプロジェクトは丸ごとOneDriveの方にアップしていますので今回の記事では**プロジェクトの歩き方**的なお話をメインに、**どのフォルダにどのようなアセットがあるのか**というのを紹介していきます。


#プロジェクトはこちらです！
今回解説するプロジェクトはOneDriveにアップしてあります。バージョンは**4.18.2**です。

[StealthGameExample_Ver1_5.zip](https://1drv.ms/u/s!Au-8FqgREBKZhTC3k-2_VILJrrXl)


#プロジェクトの歩き方
##フォルダ構造
フォルダの構造は
[Gamemakin UE4スタイルガイド](https://github.com/akenatsu/ue4-style-guide/blob/master/README.jp.md)
の
[2. コンテンツディレクトリの構成について](https://github.com/akenatsu/ue4-style-guide/blob/master/README.jp.md#structure)
に則って構成されています。

![2018-01-06_17h22_48.png](https://qiita-image-store.s3.amazonaws.com/0/104467/7ecb66a5-3ad8-85cc-d425-d18c573315c0.png)

コンテンツ（Content）フォルダ内に**プロジェクトと同名のフォルダ**があります（黄緑枠）
これは「[2.2 プロジェクト固有アセットには、トップレベルのフォルダを使うこと](https://github.com/akenatsu/ue4-style-guide/blob/master/README.jp.md#2.2)」にあるようにプロジェクト固有のアセットが含まれています。

プロジェクトをダウンロードされた方は基本的に黄緑枠を見ることになります。

###C++クラス - StealthGameExample
![2018-01-06_17h31_05.png](https://qiita-image-store.s3.amazonaws.com/0/104467/64a723ac-0ae3-2ab2-9653-5b76a26e2e8d.png)

このフォルダにはC++で定義されたクラス達が格納されています。
AIに「ある動作」をさせるために必要なインターフェースの継承や関数のオーバーライドを行っています。


###Coreフォルダ
[2.5 クリティカルなブループリントやその他のアセットのために、 Core フォルダを使うこと ](https://github.com/akenatsu/ue4-style-guide/blob/master/README.jp.md#structure-core)

UE4スタイルガイドでCoreフォルダは以下のブループリントが所属することになっています。

>たとえば、 GameMode、Character、 PlayerController、GameState、 PlayerState、および関連するブループリントはここに属していなければなりません。

自分のプロジェクトもCoreフォルダには**「キャラクタの基底BPやBPインターフェース」、「武器の基底BPやBPインターフェース」、「AIが動作するのに必要なBP（デザイナが触る必要の無いもの）」等**が入っています。

![2018-01-06_17h03_41.png](https://qiita-image-store.s3.amazonaws.com/0/104467/9aac811e-42b5-5757-319e-1ed384f49ba1.png)

しかし一つ例外があります。

PlayerControllerは以下のように
![2018-01-06_17h04_55.png](https://qiita-image-store.s3.amazonaws.com/0/104467/38dbb91c-6573-9fc3-0d3f-a1361e6d97eb.png)
Characterフォルダ内のPlayerフォルダに格納されています。
申し訳ありません。これは**純然たる自分のミス**です。

>これは非常に明確な「これらに触れないでください」という他のチームメンバーへのメッセージになります。

引用したとおりPlayerControllerはCoreフォルダに置くべきで担当者以外が触れてしまう状況に晒してしまうと大きなトラブルになる可能性もあります。
これを読んでくださっている皆さんには是非気をつけて頂きたいと思います。

###Charactersフォルダ
![2018-01-09_14h00_05.png](https://qiita-image-store.s3.amazonaws.com/0/104467/e51661a5-28b4-f520-ef63-0e7ece3d10e9.png)

このフォルダにはCoreフォルダに有る基底BPを継承したブループリントが格納されており、ブループリントには各キャラクタ固有のアクションが実装されています。
ブループリント以外にもフォルダ名に関連するアニメーションBPやインターフェースBP、列挙型等も格納されています。

「AIの実装はどうなっているのだろう？」「プレイヤーはどう実装されているのだろう？」と疑問に思った方は大体このフォルダにあるアセットを見れば解決すると思います。


###Controllableフォルダ
![2018-01-06_19h56_23.png](https://qiita-image-store.s3.amazonaws.com/0/104467/c504e11b-2ec0-58f2-96f0-01be0de90eb4.png)

このフォルダはUE4スタイルガイドには例で示されていないフォルダですが「Controllable」という名が付いている通り**実際に操作できるアクタ**を格納しているフォルダです。
フォルダにはSecurityCameraブループリントや構成に必要な各アセットが格納されています。

Charactersフォルダに格納せずControllableというフォルダに格納した明確な理由は**特にありません**。
ただ何となく「キャラクターでは無いよなぁ。Watch Dogsにあるハッキング可能なオブジェクトというだけだし...」というぼんやりとした考えです。

もしも複数名でのチーム制作の場合はここらへんの分類はきちんとしておいたほうが良いかもしれません。
「プレイヤーが操作可能なオブジェクトは全てCharactersフォルダに入れる」でも問題は無いでしょう。


###Weaponsフォルダ
![2018-01-06_21h00_05.png](https://qiita-image-store.s3.amazonaws.com/0/104467/2ced6bdb-002a-04d4-77cd-c36669ee5907.png)

このフォルダにはCoreのWeaponsフォルダにある基底クラスを継承した各種武器を実装しています。


#終わりに
フォルダ構造編は以上で終了です。
このプロジェクトを覗くにあたって多くの方が知りたいであろうアセットが入っているフォルダを紹介してみました。

次回は各アセットが実装している機能を紹介＆解説していこうと思います。

以上となります。お疲れ様でした。