検証バージョン: UE4.26.0
本記事では、ナビゲーションの機能を調整する時にどこを変更すればよいか、見ればよいかをまとめたものです。
ナビメッシュの精度を調整する
ナビゲーションデータのCellSize
を調整することで、隣接エリアの精度を調整して滑らかなメッシュを生成できるようになります。
ナビメッシュの傾斜を調整する
ナビゲーションデータのCellHeight
、AgentMaxSlope
を調整することで、隣接エリアの判定を広くして滑らかなメッシュを生成できるようになります。
ナビメッシュの隙間を補完する
Nav Link ProxyやNav Link Proxy Componentを使用します。段差、高所から降りる、隣接面をカバーするようなケースできます。
ナビメッシュの精度をさらに上げる
RecastNavmeshのRegionPartitioning、LayerPartitioningの方式をMonotoneもしくはChunkyMonotoneに変えることで更に密なメッシュが構築できるようになります(ただし生成コスト増大)。
経路探索に優先度をつける
Nav Areaを作成してNav Modifier Componentを配置しコストに重みづけを行います。
ナビメッシュを動的に更新する
RecastNavmeshのRuntime GenerationをDynamicもしくはDynamic Modifiers Onlyに変更する。Dynamic は全て(StaticMesh)などの変更時にNavmeshの再生成を実施、Dynamic Modifiers Onlyは Nav Modifier の変更時のみにNavmeshの再生成を実施します。
エージェントの種類に応じたナビメッシュを設定する
Project SettingsのSupported Agentsに追加します。Agent数だけNavmeshをレベル上に生成するため、生成コストとメモリに注意する必要があります。
オブジェクトの下部を進行できないようにする
StaticMeshであればbFillCollisionUnderneathForNavmeshを有効にすることで、オブジェクトの下部をヌルエリアを生成できます。
オブジェクト自体にエリアを設定したい
StaticMeshであればIsDynamicObstacle=trueとしてAreaClassからオブジェクトのクラスを設定できます。
オブジェクトの空洞の中に生成されるエリアを埋めたい
NullAreaのModifierを埋め込む、CanEverAffectNavigationを無効にするか、少し工夫が必要です。
サブレベル毎のナビメッシュを展開したい
Dynamicに設定することで予めビルドしたナビメッシュはストリーミングできますが、完全にサポートされていません(ワールドコンポジションのケースなど)。
パスのコストを調整する
NavigaitonTestingAcotrのPathfinging機能を使うとStepとコスト計算を容易に視覚化できます。
パスの軌跡を確認する
NavigationPath::EnableDebugDrawing()を毎フレーム呼び出せばパスを描画し続けることができます。