【UE4】AI Perception の紹介と使い方

#AIの視覚と聴覚
UE4のAIコンポーネントには視覚や聴覚がひとまとめになった「Pawn Sensing」と呼ばれるコンポーネントがあります。
このコンポーネントの便利なところは視野範囲（広さ、角度）、聴覚範囲が設定出来るところです。これにより少し面倒な視野範囲の計算だったり視認時の距離チェック等が不要になるため非常に手軽に扱えます。
しかし、このコンポーネントには「視野内にキャラクタが入った」というイベントは受け取れますが、「視野外にキャラクタが出た」「見失った」というイベントまでは取得できません。
結局「見失った」ということをAIが知りたい場合は、AI側でLine TraceやLine Of Sightを用いて常にもしくは一定間隔でチェックをしなければいけませんでした。

#AI Perceptionとは？
Pawn Sensingが見失ったイベントを取得出来ないのに対し「AI Perception」はきちんと「視野外にキャラクタが出た」「視線を何かしらによって塞がれた」事による「見失った」イベントが取得出来ます。
更にAI Perceptionには視野範囲・視認したオブジェクトに対し再度気づく距離・知覚した情報を忘れる時間等を設定出来るようになっており、柔軟な振る舞いが可能となっています。
設定出来る知覚は視野だけではなく、聴覚や痛覚（ダメージ）等もあります。


#前準備
ここからは実際にAI Perceptionコンポーネントを使ってAIに視覚をもたせます。
TopDownテンプレートを用いて説明しますが、特に使用するテンプレートやプロジェクトについて指定はありません。
プロジェクトが準備出来たら「キャラクタクラスを継承したブループリント」「AIControllerを継承したブループリント」を作成します。
AI Perceptionコンポーネントについての説明ですので、ここではビヘイビアツリーとブラックボードは必要ありません。

#AI Perceptionで視覚を設定する
キャラクタとコントローラーが用意出来た所でAIに視覚を持たせます。
Pawn Sensingコンポーネントの場合ですとキャラクタの方に追加しますが、AI Perceptionコンポーネントでは「コントローラー側にコンポーネントを追加する」という形になります。

|||
|:-:|:-:|
|![2_コンポーネント追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/32d5a806-5f16-cc04-bfe1-2af5497b6f47.png)|![1_コンポーネント追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/c9af4436-72df-c10d-f5d5-ca3167c8ad87.png)

AI Perceptionコンポーネントを追加したら詳細パネルで視覚を持たせるために１～４の順で設定をしていきます。

||
|:-:|
|![3_コンポーネント設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/a9638408-f763-afaa-5bcd-e0d56bad0379.png)
1. ＋ボタンを押し要素を一つ追加
2. 設定する知覚の種類を指定（ここでは視覚）
3. 知覚を検出する所属先の設定（敵、中立、味方）を全てチェックする
4. Sight Radius・Lose Sight Radiusを好きな値に設定する（画像の方で数字書くの忘れてましたすいません）

以上でコンポーネントの設定は終了です。次はブループリントの方で「視野に入った」「視野外に出た」を取得します。

#「視野に入った＆出た」をブループリントで取得する
AI Perceptionには更新イベント（On Perception Updated）が用意されており、何かしらの知覚が検知された時点でイベントが発行されます。
詳細ビューの下にある「On Perception Updated」の＋ボタンを押すとイベントグラフに On Perception Update ノードが追加されます。

|||
|:-:|:-:|
|![4_更新イベントを追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/2d7b1ea6-06fb-de67-965f-21d9bac004c8.png)|![5_追加された更新イベント.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/2272f698-3bce-c163-ffb5-2cd45fe42753.png)

追加された更新イベントに対し以下のようなブループリントを組みます。
![6_BluePrintで検出イベントを取得.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/089d77a3-12f0-39b8-53ab-c7e80dfd3516.png)

あとは作成したキャラクタの「AI Controller Class」に上記の設定を済ませたコントローラーブループリントを指定して、レベルに配置すれば「視野範囲に入った」際に「Visible」を表示し、「視野外に出た」「何かしらの障害によりプレイヤーを視認できなくなった」際に「Not Visible」が表示されるようになります。

||||
|:-:|:-:|:-:|
|![7_視野範囲に入った.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/219cc9b5-953a-06ce-d0d9-c1300ba1bab2.png)|![8_視認できなくなった.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/4919307a-31dd-49c6-829d-b8343bc4db75.png)|![9_視野外に出た.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/c74b2ca9-1c8a-81bc-9a67-cf9fb61a5249.png)|

以上でAI Perceptionによる視覚の設定は終了です。

#AI Perceptionによる聴覚の設定とブループリントで情報取得
今度はAIに聴覚を持たせます。コンポーネントの設定手順は視覚の場合と同じです。
![10_聴覚設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/0c7066ae-9a67-01c6-7fa5-06f27224149a.png)
ここでは知覚を忘れる「Max Age」を設定しています。
ブループリントは以下のようになります。
![11_BluePrintに聴覚取得を追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/31ccb2a1-32df-750e-c0ca-5c2fd03b6e0a.png)

AIが音による刺激を検知する場合はPawn Sensingと同様にNoiseイベントを使います。ですので、プレイヤーのブループリントにNoiseイベントを追加しましょう。
以下のように組みます。
![12_Noiseノードをプレイヤー側に追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/f285b551-36bd-2c65-2ae2-71fdb7e356c7.png)
AI Perceptionを追加したAIに対しノイズイベントを発行する場合は「Report Noise Event」ノードを使用します。

これによりBキーを押した際に「Heard」が表示され、Max Age秒後に「Not Hear」が表示されます。
![13_聞こえた後に忘れる.PNG](https://qiita-image-store.s3.amazonaws.com/0/104467/31ab8824-4eb9-3707-d7c8-18eda28b8f8a.png)

以上でAI Perceptionによる聴覚の設定は終了です。

#おわりに
AIPerceptionはPawnSensingと比べて設定項目が多く、特に範囲設定などはビューで表示されるわけではないのでやりづらい部分もありますがチューニング次第では豊富な振る舞いが可能だと思います。
今後AIを作る場面になった時はAIPerceptionを組み込んでみると面白いものが作れるかもしれません。

#おまけ
>AI Perceptionコンポーネントでは「コントローラー側にコンポーネントを追加する」という形になります。

このように書きましたがUE4.18.3ではCharacter側にAIPerceptionを付けてもここで紹介した２つのAISenseについては動作します。
詳しくは[【UE4】AIPerceptionをAIControllerとCharacterにアタッチした時の違い](https://qiita.com/Dv7Pavilion/items/63ae78dbee298642eccb)を見ていただければと思います。