このガイドの最新バージョンは、次の Unreal Engine ローカル インストール ディレクトリにあります。Engine\Source\Runtime\NavigationSystem\DevDocs\How To Optimize Navmesh Generation.md
概要
Unreal Engine の ナビゲーション システム によって、人工知能 (AI) エージェントにパス検索能力が与えられます。スタート位置から目的地までのパス検索を可能にするために、ワールドのコリジョン ジオメトリから ナビゲーション メッシュ が生成されます。
ランタイム時にナビゲーション メッシュのローカライズされた部分を再構築できるよう、ナビゲーション メッシュはタイルに細分化されます。
ナビゲーション システムには、上級ユーザーがレベル内におけるナビゲーション計算方法を変更できるよう、さまざまな設定が用意されています。このガイドでは、ナビゲーション メッシュの生成方法を最適化するための推奨設定を説明します。
できる限り大きいセルのサイズとセルの高さを使用する
Cell Size プロパティと Cell Height プロパティは、ナビゲーション タイルの生成に使用するボクセルのサイズを定義します。ボクセルが小さいほど精度が高くなり、障害物の周囲のナビゲーションが正確になります。しかし、ボクセルが小さいほど、ランタイム時にナビゲーション メッシュを再構築するのに必要な処理量が多くなります。
そのため、セル (ボクセル) のサイズと、プロジェクトで必要なナビゲーション精度のバランスを取ることが重要です。
ナビゲーション メッシュの Cell Size プロパティと Cell Height プロパティを調整するには、以下の手順に従います。
-
[Settings (設定)] > [Project Settings (プロジェクト設定)] をクリックして [Project Settings] ウィンドウを開きます。
-
[Navigation Mesh (ナビゲーション メッシュ)] セクションに移動し、 [Runtime (生成)] カテゴリまで下にスクロールします。生成速度を改善するために、[Cell Size (セルのサイズ)] と [Cell Height (セルの高さ)] の値を増やします。なお、サイズと高さの値を増やすと、レベル内のナビゲーション メッシュの精度が低下することに留意してください。
-
別の方法として、[World Outliner (アウトライナ)] で RecastNavMesh-Default アクタを選択して [Details (詳細)] パネルに移動し、レベル内のナビゲーション メッシュを個別に調整することもできます。
-
この例では、 [Cell Size] を 19 から 64 に変更しました。どのように精度が低下し、レベル内のオブジェクト周囲のナビゲーション メッシュの正確性が低下しているのかに注目してください。変更後のセル サイズ 64 では、壁とボックスの間にナビゲーションが生成されません (以下の図の矢印参照)。


推奨事項
セルの大きさを、エージェントに必要な精度を確保しながら、できる限り大きくします。
上記の例では、 [Cell Size] を 64 に設定したら、壁とボックスの間のパスがなくなってしまいました。エージェントにとってこのパスが必要な場合、パスが生成されるまで [Cell Size] の調整を続けるか、ボックスの位置を壁から離れた場所に移動します。
タイル サイズを制限する
ランタイム時にナビゲーション メッシュのローカライズされた部分を再構築できるよう、ナビゲーション メッシュはタイルに細分化されます。各タイルはセルから構築されるので、ナビゲーション タイルの再構築は、新しいコリジョン情報を持つセルの再構築になります。
大きいタイルは、小さいタイルと比べて多くのセルを含んでおり、再構築に多くのコストがかかります。しかし、タイルの処理時には、タイルのエッジにある連続するセルの処理も行われます。つまり、小さなタイルを数多く処理する際は、1 つの大きなタイルを再構築するよりも多くのコストが発生する場合があるので、、タイルのサイズを設定する際にはオーバーヘッド コストも考慮する必要があります。
推奨事項
タイル サイズ は、各辺 32 ~128 セルにします。このようにすると、ランタイム時のタイルの再構築で最高のパフォーマンスになります。
以前の例では、 [Cell Size] を 64 に設定しました。この場合、[タイルサイズ UU] は 2048 (6432) ~ 8192 (64128) に設定します。

メッシュに単純化されたコリジョンを使用する
ナビゲーション システムでは、ナビゲーション メッシュの生成に各オブジェクトのコリジョン データを使用します。オブジェクト コリジョンが単純なほど、コリジョン データの三角ポリゴン数が多い場合と比べて処理が高速になります。
推奨事項
可能な場合は、スタティック メッシュに 単純なコリジョン を使用します。コリジョン メッシュで使用される三角ポリゴン数が少ないほど、生成速度が速くなります。
ナビゲーション メッシュに影響するオブジェクト数を減らす
デフォルトで、レベル内のブループリント アクタとスタティック メッシュがナビゲーションに影響を与えます。ナビゲーション タイルに影響するオブジェクトの数が、そのタイルの生成コストに直接影響します。
推奨事項
ナビゲーションに影響を与えることのないよう、ナビゲーション メッシュに影響を与えない小さなオブジェクトを構成することをお勧めします。レベル内のアクタを選択し、[Details] パネルに移動します。[Collision (コリジョン)] セクションまで下にスクロールして、 [Can Ever Affect Navigation (ナビゲーションへの影響を許可)] チェックボックスを オフ にします。

この設定は、レベルの侵入不可領域を移動するオブジェクトなど、ナビゲーション メッシュに影響を与えるべきではないアクタすべてでオフにする必要があります。
可能であれば、同時に、大きなタイル領域や複数のタイルへの影響も避けるべきです。
ナビゲーション生成の管理に便利なデベロッパー ツール
戦略的タイミングでナビゲーション メッシュ生成のロックとロック解除を行う
ナビゲーション メッシュの生成に影響を与える可能性のある数多くのアセットをロードする前に、ナビゲーション メッシュの自動生成を停止することが可能です。すべてのアセットのロードが完了したら、生成停止を解除します。このようにすると、同じタイルが複数回再構築されるのを防止できます。
ナビゲーション メッシュの生成をロックするには、ナビゲーション システムの bInitialBuildingLocked を True に設定します。 生成のロックを解除するには、関数 ReleaseInitialBuildingLock() を呼び出します。ロックが解除されると、ロードされたアセットでダーティとマークされたすべてのタイルがナビゲーション メッシュで再ビルドされます。これを防止するには、生成のロックを解除する前に DefaultDirtyAreasController.Reset() を呼び出します。
マルチスレッド ナビゲーション メッシュ生成を有効にする
ナビゲーション システムの MaxSimultaneousTileGenerationJobsCount プロパティを設定することで、マルチスレッド ナビゲーション メッシュ生成を制御できます。なお、FRecastNavMeshGenerator::Init() でワーカー スレッドの合計数が制限されることに注意してください。
完全にダイナミックなナビゲーション メッシュ生成で動的障害物を使用する
レベル内のスタティック メッシュとアクタを 動的な障害物 としてマークできます。動的な障害物は、生成の再ビルドが必要なナビゲーション メッシュ サーフェスをマークします。これにより、ナビゲーション タイル全体の再ビルドが妨害されます。
この方法を使用すると、完全なナビゲーション タイルを生成するよりもコストが低くなります。動的な障害物上にナビゲーション メッシュ サーフェスが不要な場合には、この方法をお勧めします。

サブレベルにロードされるスタティック ナビゲーション メッシュでデータ チャンク ストリーミングを使用する
ナビゲーション メッシュに対する変更がサブレベルのロードとアンロードだけに由来する場合は、ダイナミック ナビゲーション メッシュを使用するのではなく、ナビゲーション メッシュの生成手法を [Static (スタティック)] に設定し、[NavMesh Data Chunk Streaming (ナビメッシュ データ チャンク ストリーミング)] を使用します。
この方法を使用すると、ナビゲーション メッシュがエディタ内で完全にビルドされ、関連する部分だけがランタイム時にロードされるようになります。