[UE4] ナビゲーションシステムの概要

検証バージョン: UE4.26.0
　本記事ではUE4のナビゲーションシステムの概要を紹介します。

# ナビゲーションの概要
##Navigation System
　NavigationSystemはAIと連動して動作し、AIを備えたキャラクターの移動や動作を行う上での補助的な役割を持ちます。UE4のNavigationSystemは主に次の機能を提供します。

・ナビゲーション管理
・パス検索

　ナビゲーション管理の機能は、NavigationMeshやRecastNavMeshを利用しNavigationMeshを作成やその制御を行う機能を示します。パス検索の機能は、AIが目的地まで移動、動作を行う際の最適な移動経路を、効率的に検索、提供することを示します。

![2020-12-17_18h31_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/34304daa-2321-8a61-4691-a0613be83667.png)

##Navigation Mesh

　Navigation Mesh（以降、ナビメッシュ）はAgentがAIとしての行動を実行する領域を示すMeshです。Agentはナビメッシュの範囲内でのみ行動を行います。

![2020-12-17_18h08_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/20d1158d-8356-4cb5-3c35-2cf93bb9a2fe.png)

　ナビメッシュはNavMeshVolumeBoundsやRecastNavMeshといったアクターから自動的に生成を行います。よってAIを利用する際には、先にナビメッシュを生成するためのアクターを配置し、ナビメッシュを生成しておく必要があります。UE4ではこうした作業を簡略化し、複数のパラメータを調整するだけでNavmeshの作成を容易に行うことができ、適切なエージェントの挙動を調整することができます。

# エンジンが提供するナビゲーション機能の概要

Engineが提供する機能は主に以下の2つに分類することができます。

**・Navigation System**
　ゲームコードから直接利用できるNavigation機能と実装を提供します。プロジェクトで独自に拡張するクラスを作成したり、データを参照するのはこちら側のコードが主になります。エンジンが提供する機能やコードを知りたい場合はこちらを見るとよいです。

**・Navigation Mesh**
　ナビメッシュの構築(recast)や迂回機能(detour)を提供する実装部になります。こちらはNavigation System のオブジェクトでラップされているため直接的に手を加えることは少ないです。こちらのソースコードは以下のgithub上でも公開されているオープンソースのコードがベースとなっています。ナビゲーション機能がどのような仕組みで動作しているか知りたい場合はこちらを見るとよいです。
　[Link] : http://masagroup.github.io/recastdetour/index.html

![2020-12-17_12h56_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/663313d0-964e-1f08-4a60-b845bdaa599f.png)


# ドキュメント
　ナビゲーションに関連するドキュメントはあまり多くないですが、以下のドキュメントがとっかかりの参考になります。まずはここでどのような機能があって、どのような操作を行うかを学ぶことができます。

**・NavMesh コンテンツ サンプル**
　サンプルを使った大まかなナビゲーションの機能が書かれています。
https://docs.unrealengine.com/ja/Resources/ContentExamples/NavMesh/index.html

**・Navigation コンポーネント**
　NavModifierコンポーネントの機能について書かれています。　
https://docs.unrealengine.com/ja/Basics/Components/Navigation/index.html

**・ビヘイビア ツリーのクイックスタートガイド**
　ナビメッシュを生成するためのバウンスの配置方法が記載されています。
https://docs.unrealengine.com/ja/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/BehaviorTreeQuickStart/index.html

　とはいえ、このドキュメントだけでは中々把握して使うのが難しいです。なので取り合えず動かして動作から学ぶか、次の情報を先に見ておくとよいかと思います。

# 詳細
 各機能の詳細や実際に使う上での調整方法について以下の記事にまとめましたのでそちらをご参考頂ければと思います。

[[UE4] ナビゲーション機能を提供するクラス-1](https://qiita.com/EGJ-Ken_Kuwano/items/53c1ecc3f19958183887)
[[UE4] ナビゲーション機能を提供するクラス-2](https://qiita.com/EGJ-Ken_Kuwano/items/15479e1ca425bc153786)
[[UE4] ナビゲーションのパフォーマンス](https://qiita.com/EGJ-Ken_Kuwano/items/90f04565b67f4a6ef207)
[[UE4] ナビゲーションシステムの設定とコマンド](https://qiita.com/EGJ-Ken_Kuwano/items/c1facb6014f67cf323e6)
[[UE4] ナビゲ―ション機能を調整する](https://qiita.com/EGJ-Ken_Kuwano/items/63f1c728403ee0518d44)
[[UE4] RecastDemoを使ったシミュレーション](https://qiita.com/EGJ-Ken_Kuwano/items/e58e3c7ac0e2f82e5bda)

# 用語
 UE4のナビゲーション関連のソースコードを見る際に知っておくと役立つ頻出用語は以下の内容になります。

|用語			|説明									|
|:--			|:--									|
|エージェント<br>Agent	|AIで動作するキャラクター、メタAIなど対象				|
|コスト<br>Cost		|パスやナビメッシュの生成する領域に割り当てられる重み付け		|
|更新エリア<br>Dirty Area|ものが壊れる、ドアが開く等でナビメッシュに変化が発生した領域		|
|迂回<br>Detour		|パス検索時の移動に関すること						|
|タイル<br>Tile		|ワールド上をグリッド分割した領域<br>タイルを更に分割してナビメッシュは生成される|
|パス<br>Path		|エージェントが目的地まで行動、進行する経路				|
|八分木<br>Octree	|ナビメッシュの形成に影響するコリジョン検索のための空間分割検索	|
|障害物<br>Obstacle	|パス検索の妨げ、ナビメッシュ構築の阻害となるようなオブジェクト	|
|生成<br>Recast		|ナビゲーションシステム上では生成,管理することを指します		|