[UE4] ナビゲーションシステムの設定とコマンド

検証バージョン: UE4.26.0
　本記事では、ナビゲーションシステムに関連する設定とコンソールなどを紹介します。

# 設定
　エディタ上で設定することができるProject SettingsとEditor Preferenceについて記載します。

## Project Settings
　Project Settingsでは主にシステム全体として適用されるパラメータの定義を行い、ここには大きく分けて`Navigation Mesh`、`Navigation System`の2つの内容を設定することができます。

![2020-12-18_17h14_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/5481a2d1-e1d4-e221-3d8d-97dfd675632b.png)

### Navigation System 
　Navigation SystemとしてNavigation全般の制御に関する内容を設定します。実際には`UNavigationSystemV1`の項目を設定することになります。

|項目|説明|
|:--|:--|
|**Navigation**	|	|
|Default Agent Name	|デフォルトサポートエージェント<br>Noneでない場合、デフォルトでサポートするエージェント名を指定します|
|Crowd Manager Class	|CrowdManagerクラス指定<br>使用するCrowdManagerクラスを指定します	|
|**Navigation**	|	|
|Auto Create Navigation Data	|ナビゲーションデータ自動生成<br>レベル初期化時にSupportedAgetsの整合性をチェックし不足しているRecastNevMeshを生成します、Editor再起動で反映	|
|Spawn Nav Data in Nav Bounds Level	|ナビデータのサブレベル生成<br>有効な時、サブレベルにBoundsがある場合はナビデータもサブレベルに生成します<br>無効な場合はパーシスタントレベルを尊重します|
|Allow Client Side Navigation	|クライアントナビゲーション許可<br>Server-Client構成の場合においてClientでNavmeshを生成するか	|
|Should Discard Sub Level Nav Data|サブレベルナビデータ非許可<br>サブレベルに配置されたナビデータの読み込みを無効化します	|
|Tick While Paused	|ポーズ中の更新許可<br>ゲームのポーズ中にもナビゲーションシステムのTick更新を許可するか	|
|Initial Building Locked	|初期ビルドロック設定<br>trueに設定された場合、RecastNavMeshのRuntimeGeneration設定がDynamicであってもNavmeshの再構築は行わず初期構築時の状態でロックされる	|
|Skip Agent Height Check When Picking Nav Data	|高さチェックスキップ<br>最適なAgentDataを選択時にHeightチェックをスキップしてRadiusのみ対象とする	|
|Data Gathering Mode	|ナビゲーションデータ収集設定<br>Navigation Octreeのスライスタイミングを意図的に遅らせる場合Lazyに設定	|
|Dirty Areas Update Freq	|更新エリアチェック頻度 [fps]<br>Navmeshで変更が発生したAreaの再構築を実行する周期の設定(60=1/60 sec周期)<br>DirtyAreaのRebuildチェックはNavigationSystemのTickで常に監視	|
|Dirty Areas Warning Size Threshold	|更新エリア警告ログ閾値<br>正の値が設定された時にその値以上の2Dサイズの変更エリアを検出したらログ出力する|
|**Navigation Enforcing**	|	|
|Generate Navigation Only Around Navigation Invokers	|強制ナビゲーション生成<br>有効な場合Navmesh Volumeの範囲ではなくNavigation Invokerの指定範囲を優先して強制的にNavmeshを生成する	|
|Active Tiles Update Interval	|有効タイル更新間隔 [Sec]<br>InvokerによるNavmesh生成のためのタイル生成間隔	|
|**Agents**	|	|
|Supported Agents	|サポートエージェント<br>Agent毎に任意の設定を可能、サポートするエージェントはRecastNavmesh毎に管理され、Navmesh Volume毎にサポート対象を任意に設定することが可能	|
|Name	|サポートエージェント名<br>サポートするAgentの名前を任意に付けることが可能<br>RecastNavmeshの名称付与にも使用される	|
|Color	|サポート領域のNavmeshカラー<br>Navmesh生成時のデバッグ描画時色指定<br>エージェント毎の有効領域を視認するのに有効	|
|Default Query Extent	|Nav Query生成エリアサイズ<br>ProjectPointで投射面を検索する際のPolygon検索範囲	|
|Navigation Data Class	|NavData設定<br>Navigationをサポートするエリアデータ指定	|
|Nav Agent Radius	|エージェント半径<br>最適なSupported Agentsのデータを決定する際に基準となるAgent半径値<br>この値がCharacterのCapsule Radiusと最も近い値を持つものを優先する<br>(複数のSupportedAgentsが設定されている時のみ)	|
|Nav Agent Height	|エージェント高さ<br>最適なSupported Agentsのデータを決定する際に基準となるAgent半径値<br>この値がCharacterのCapsule Height*2と最も近い値を持つものを優先する<br>(複数のSupportedAgentsが設定されている時のみ)	|
|Nav Agent Step Height	|Navmeshの生成をサポートする段差値<br>隣接するObjectに対して指定の値だけZ値の差をカバーしてNavmeshを生成Navigationと障害物間のNavmeshを適応する補正値	|
|Nav Walking Search Height Scale	|Nav Walking設定時に投影するNavmesh検索時の境界の高さに適用するスケール係数	|
|PreferredNavData	|優先Nav Data設定<br>Navigationをサポートするエリアの属性指定するが、Nav Movementを行うAgentの有効Nav Dataチェックにも使用され、自身のNav Dataと一致しない場合には適切なNavDataを自動選択してNav Moveを行う	|
|Can Crouch	|移動モード「しゃがみ」許可<br>※ 未使用	|
|Can Jamp	|移動モード「ジャンプ」許可<br>※ 未使用	|
|Can Walk	|移動モード「歩行」許可<br>※ 未使用	|
|Can Swim	|移動モード「泳ぎ」許可<br>※ 未使用	|
|Can Fly	|移動モード「飛行」許可<br>※ 未使用	|
|Supported Agents Mask	|エージェントサポートフラグ<br>使用するエージェントの有効/無効を制限するフラグ	|
※未使用：設定しても何かに影響があるというわけではないものの、項目の設定内容は反映されているため、値自体を使用して拡張先で使用する事は可能です。

### Navigation Mesh
　プロジェクト内で共通のNavigation Data（ナビデータ）を設定します。実際には`ARecastNavMesh`の項目を設定することになります。

　設定内容については、[Recast Navmesh](https://qiita.com/EGJ-Ken_Kuwano/private/53c1ecc3f19958183887#recast-navmesh)をご参考ください。

## Editor Preference
　レベルエディタでのビューポート操作など、ナビゲーション関連のエディタ設定について紹介します。

### General - Keyboard Shortcuts

|項目|説明|
|:--|:--|
|**Level Editor**	|	|
|Cycle Navigation Data Draw	|RecastNavMeshデバッグ描画一括で切り替えコマンド<br>複数Agentが登録時、デバッグ表示をAgent毎に順番に切替表示する際に役立つ<br>Show Navigationが有効な状態でのみ有効	|
|**Level Viewports**	|	|
|Show Navigation|Navmeshのデバッグ表示の有効/無効を切り替えコマンド<br>Navmeshが存在していない、生成されていないような条件においては無効|
|Show Navigation Sprites|Navigation関連ActorのSprite表示切り替えコマンド<br>特にLevel Editor上で編集する際に表示を切り替えるのに役立つ|
### Level Editor - Miscellaneous

|項目|説明|
|:--|:--|
|**Editing**	|	|
|Update Navigation Automatically	|ナビメッシュ自動リビルド<br>Level Editorの操作時に更新エリアが発生した際に自動的にリビルドを行います<br>大規模なNavigationの編集を行う際は編集を行うたびにRebuildが発生するため注意	|

# コンソールコマンド
　ナビゲーション関連のコンソールコマンドについて紹介します。

**Show Navigation**
Navmeshの表示を行うためのコマンドです。Navmeshのテストを行う際は以下のような初期処理において表示を有効にしておくと、実行時にNavmeshの範囲を表示できるため便利です。
![2020-12-18_17h18_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364110/a0923717-92ab-c224-4f62-f55fa811433c.png)

**CycleNavDrawn**
RecastNavMeshのEnableDrawingフラグ(デバッグ描画)を一括で切り替えるコマンド
複数Agentが登録時、デバッグ表示をAgent毎に順番に切替表示する際に役立つ
Show Navigationが有効な状態でのみ有効

**RebuildNavigation**
NavigationのRebuildを実行するコンソールコマンドです。RecastNavmesh（ナビデータ）がレベル上に存在しない場合は無効となるため、NavmeshBoundsVolumeとRecastNavmeshが存在していることを事前にご確認ください。

**CountNavMem**
NavgationDataのメモリ使用量を表示するコマンドです。Nav OctreeはAllocateメモリを表示、RecastNavmeshはAllocateメモリと自身のサイズします。

**Stat Navigation**
Navigation関連のStatsを表示するためのコマンドです。Navigation関連のパフォーマンスを調べたい時に使用します。ランタイムでの使用メモリ量や、ナビメッシュ構築にかかるパフォーマンスの簡易的な計測が可能です。

**ai.crowd.xxx**
Visual Loggerで表示するログの情報を切り替えるコマンドです。詳細はCrowdManager.cppをご確認ください。

# コマンドレット
　ナビゲーション関連のコマンドレットについて紹介します。

### ResavePackages
`ResavePackages`コマンドレットに引数`-BuildNavigationData`を追加してオフラインでのナビメッシュ生成＋保存ができるようになっています。ResavePackagesの使い方に関しては[[UE4]全アセット または 特定アセットを強制的に再保存する方法について（ResavePackagesCommandletの解説含む）](https://qiita.com/EGJ-Kaz_Okada/items/acd7612390feb0084afa)