UE4でAIを組み込んで各機能の取り扱いを考察する（その２：ビヘイビアって必要？）

#UE4でAIを組み込んで各機能の取り扱いを考察する（その２：ビヘイビアって必要？）

##クイックスタートで作った動作
プレイヤーの近くに移動する
![SnapCrab_NoName_2017-5-19_8-45-56_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/dbc58d79-c191-0859-fc8f-c8950cc8d651.jpeg)

##同じ動作をするブループリントを極力短くキャラクター側に書いてみる
![SnapCrab_NoName_2017-5-21_0-12-56_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/96081d8b-905f-1124-9133-d130d8e720aa.jpeg)

細かい判断による動きは違うものの、上記のブループリントを動作させると、
![SnapCrab_NoName_2017-5-21_0-12-38_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/85fc0bb4-536f-3090-6a75-70a871beaae9.jpeg)
↓
![SnapCrab_NoName_2017-5-21_0-11-54_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/b299274f-be1c-a89b-5286-421e35daa8a7.jpeg)

ほぼ1命令で黄色のキャラクターが見た目同じような動作をしました。

##結論
ビヘイビア必要ない。

、、、いやいや、本当にそうでしょうか？

##機能別にビヘイビア要素を確認してみる
本家のDocumentにもありますが、再度、確認しましょう。

###Composites
Sequence,Selector
![SnapCrab_NoName_2017-6-17_13-29-8_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/b9a20712-8130-935b-8a73-ddfc439d59ca.jpeg)　![SnapCrab_NoName_2017-6-17_13-46-5_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/5fc6004e-1d8a-5c9f-df0f-32d3127cd9d6.jpeg)

ツリーのノードになります。
Selectorは右からチェックしていってTrueが返ってくるTaskがあるまで処理されます。
Sequencerは右から順番にTrueが返ると次のTaskに移って処理されます。

##Decorator
![SnapCrab_NoName_2017-6-17_13-44-53_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/09e1df4a-7613-2ced-fc16-12ca2c233e89.jpeg)

条件文を書きます。
この条件はひとつ前のノードのServiceで定義された処理のみが有効です。

##Service
![SnapCrab_NoName_2017-6-17_13-45-33_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/001cbcfc-8fdc-e6a8-7392-b093705fe00d.jpeg)

フラグの更新を行います。
たとえ、MoveToでTaskが止まっていてもServeceに設定された感覚で呼ばれますので注意しましょう。

##Task
![SnapCrab_NoName_2017-6-17_13-47-45_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/8c8e1535-9879-e2a4-32bf-5705fc613cb0.jpeg)
キャラクターの行動を記載しましょう。
Sequenceでターゲットを設定後、MoveToで動かすのがよいのではないかと思います。


もろもろ検証した結果、上記の役割で動作させるのがよいのではないかと考えますが、如何でしょうか？

##ビヘイビアツリーのメリット
さて、メリットは何でしょうか？
一つ作ってみて思ったのは、Decorator,Service,Taskを再利用してルールや個性を作るためのモデルとして、有用であることです。
同じ条件のBlackboadの設定を変更することで、プレイヤーキャラクターをターゲットにしたり、単なるアクターオブジェクトをターゲットにしたりすることができるのは、BluePrintの作業時間を考えてもかなり効率的に設定できます。
たくさんの条件文（Decorator)やフラグチェック（Service）によって、新しい制御も追加しやすく、優先度も位置を変えるだけでよいので、かなり設定が楽になると思います。
また、公式ドキュメントにもある通り、デバッグも用意であることもメリットの一つでしょう。

##ビヘイビアツリーのデメリット
Blackboadのフラグが有効になっている範囲が明確でない点はかなり最初戸惑います。
引っかかった点を挙げていきます。

###注意点１．Blackboadの値の有効範囲
一番上のノードのServiceでフラグや値を更新しても、一つノードを挟むだけで無効化されてしまします。
そのため、常に値の有効範囲を注視する必要があり、気を付ける必要があります。

###注意点２．Moveto関数の処理
MoveTo関数も下記のようにSucessからノードをExcuteに引っ張らないと目的地まで移動し続けるような形で意図した動作をしてくれないので注意しましょう。
![SnapCrab_NoName_2017-6-17_13-56-30_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/5d3d77f6-7cec-1f1c-2070-44bb4753d53d.jpeg)

###注意点３．MoveToへ引き渡すターゲット
MoveToで動作している間も、Servieは回ってくるため、下記のように移動ターゲットはSequenceを使って設定するのがよいのではないだろうかと考えます。
Serviceで作成するとターゲットがころころ変わり、今どこに向かっているのかもわからなくなります。
![SnapCrab_NoName_2017-6-17_13-59-49_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/d7503326-3a42-3eb5-bfff-90b9614097ce.jpeg)



##ゲームに必要なAIの要件は？
Q.ゲームに必要なAIの要件は？
A.様々です。

いろんなジャンルで必要とされるAIの内容は違います。
クリボーやノコノコ、最近はモンハンのボスでも、日本でよく見られるアクションゲームではある一定のルールで行動を繰り返すパターンが多数みられるでしょう。

対して、FPSやウォーゲームを模した海外のアクションではバトルフロントしかり、ホライズンしかり、しっかりと統率された環境上で、自分と同じあるいは、制限化にあるプレイヤーのような動作を求められるでしょう。



AIとは
*人工知能（じんこうちのう、英: artificial intelligence、AI）とは、人工的にコンピュータ上などで人間と同様の知能を実現させようという試み、或いはそのための一連の基礎技術を指す。(wiki調べ）*
https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD

ビヘイビアツリーとは
*Behavior Trees (ビヘイビアツリー) は、闇に潜む憎きゴキブリから、シューティング ゲームの Bot に至るまで、撃つタイミングやヘルス値と弾薬を求めるタイミングが分かる AI をアンリアル エンジン 4 で作るパワフルなツールです。*
https://docs.unrealengine.com/latest/JPN/Engine/AI/BehaviorTrees/index.html

改めて、用語もおさらいしてみましたが、ビヘイビアツリーの説明を見ると、FPSを作るためのエンジンだなぁとつくづく思います。

それでも、DecoratorとTaskが再利用できるだけでもかなりの効率化となりますので、
2つ以上の判断を用いるAIを作成する場合は、ビヘイビアツリーを使うのがよいでしょう。

次回はある有名なゲームを参考に作成したAIの作成例です。
↓
こんなの
![SnapCrab_NoName_2017-6-17_14-55-17_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/b988eba0-4d83-db1a-5e44-b65c6b7bf6b3.jpeg)

![SnapCrab_NoName_2017-6-17_15-1-40_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/b0aa9512-6b0f-33b1-b23e-8b3edbd93e0b.jpeg)

（※補足）
上記内容の作成途中のまま更新が止まっているパッケージはこちら
（もし気まぐれに続きを更新する場合はそちらの記事にリンクを移動させます）
https://drive.google.com/file/d/1A512B14WOFH1uP4PGlJac1qR-TVZGuUi/view?usp=sharing

##参考Webページ
◇AIについて
https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD

◇ビヘイビア
https://docs.unrealengine.com/latest/JPN/Engine/AI/BehaviorTrees/index.html