3DGS シーンにナビゲーションメッシュを生成する
Navigation System Support
適用範囲
本編はLCC のコリジョンデータでナビゲーションを構築する場面を対象としているため、ALCCActor と ALCC2Actor にのみ適用できる。コリジョンデータを持つのは .lcc と .lcc2 形式だけである。詳しくは コリジョン を参照する。
.sog、.spz、.ply はコリジョンデータを含まないため、Blocking Volume や近似メッシュで歩行可能な領域を自分で用意する必要がある。この種のジオメトリは標準の UE のオブジェクトなので、ナビゲーションの設定は Unreal Engine の公式のワークフローに沿って行えばよく、本編の特別な事項は関係しない。
概要
Unreal Engine の Navigation System は NavMesh を通じて AI キャラクターに歩行可能な領域を提供する。NavMesh の生成は、シーン内でナビゲーションに影響でき、かつ有効なコリジョンを持つジオメトリに依存する。
LCC のコリジョンはブロック単位の動的読み込みである。カメラ周辺の一定範囲内のコリジョンブロックだけを読み込み、カメラの移動に応じて入れ替える(仕組みは コリジョン:読み込みの仕組み を参照)。この点がナビゲーションの設定方針を直接左右する。
- コリジョンブロックが実行時に入れ替わると NavMesh の再構築がトリガーされ、カクつきの原因になる
- したがって対象領域のコリジョンを一度にすべて読み込み終えてから、
Staticモードでナビゲーションを構築する
LCC のシーンでは、Runtime Generation に Static を推奨する。Dynamic はコリジョンの変化に反応し続けて NavMesh を再構築するため、ブロック単位で読み込まれるコリジョンと組み合わせると再構築が頻繁にトリガーされ、大規模シーンでは明らかな CPU コストとカクつきを生む。
前提条件
| 条件 | 説明 |
|---|---|
| データにコリジョンファイルが含まれている | .lcc には collision.lci(旧バージョンは collision.bin)が必要。.lcc2 には data/mesh/ 下の .ply ファイルが必要。詳しくは コリジョン:前提条件 を参照する |
| コリジョンが有効になっている | Actor の bEnableCollision = true |
| コリジョンデータが読み込まれている | ビューモードで Player Collision または Visibility Collision を選ぶと、読み込み済みのコリジョンボディが見える |
| Actor がナビゲーションに影響できる | Actor の CanEverAffectNavigation = true |
| コリジョンの読み込み範囲が十分である | Max Load Collision Distance(m) がナビゲーションを構築したい対象領域を覆っている。既定値は 300 メートル |
| NavMesh の構築境界が十分である | シーンに NavMeshBoundsVolume を配置し、AI を活動させたい対象領域を覆っている |
コリジョンの読み込み距離と
NavMeshBoundsVolumeは別々の範囲を制御する。前者はどの領域にコリジョンデータがあるかを決め、後者はエンジンがどの境界内で NavMesh を構築するかを決める。対象領域で使用可能な NavMesh を生成するには、両方がその領域を覆っている必要がある。
使用手順
1. LCC のコリジョンを有効にして確認する
ALCCActor または ALCC2Actor を選択し、Details パネルで Enable Collision(bEnableCollision)を有効にする。コードから有効にしてもよい。
LCCComponent->SetLCCCollisionEnable(true);
あわせて Actor の CanEverAffectNavigation = true を確認し、そのコリジョンがナビゲーションの構築に参加できるようにする。
LCC データを読み込んだ後、ビューモードでPlayer CollisionまたはVisibility Collisionを選び、対象領域内にコリジョンボディが現れているか確認する。コリジョンは非同期の物理ベイクを使うため、3DGS の画面がレンダリングされ始めてからさらに数秒待つ必要がある場合がある。

Player Collision または Visibility Collision モードで、対象のナビゲーション領域内の LCC コリジョンボディが読み込まれていることを確認する
2. コリジョンの読み込み範囲を設定する
LCC のコリジョンは Max Load Collision Distance(m) で指定した範囲内でのみ読み込まれる。既定値は 300 メートルである。
ナビゲーションと併用する場合は、この値を AI の活動領域全体を覆うまで大きくして、コリジョンを一度にすべて読み込み終えるようにする。そうしないと実行時にコリジョンブロックがカメラの移動に応じて入れ替わり続け、NavMesh の再構築を継続的にトリガーして明らかなカクつきを生む。範囲が十分に大きければ実行時にコリジョンの変化がなくなり、ナビゲーションも再構築されない。
引き換えに起動時の読み込み時間が長くなり、メモリ使用量が増える。stat xgrids の Collision Data Usage で全量読み込み後のメモリが許容できるか確認できる。詳しくは コリジョン:コリジョンを一度にすべて読み込む を参照する。
コリジョン距離の不足を解決するために Runtime Generation を Dynamic に変更してはいけない。 Dynamic はコリジョンの読み込み範囲を広げないため、その距離を超えた領域には引き続きナビゲーション構築に使えるコリジョンが存在しない。
3. NavMeshBoundsVolume を配置して調整する
シーンに NavMeshBoundsVolume を配置し、移動と拡大縮小を行って、AI を活動させたい領域全体を覆うようにする。

NavMeshBoundsVolume を配置して拡大縮小し、ナビゲーションの構築境界が AI の活動領域全体を覆うようにする
2 つの範囲が同時に要件を満たしていることを再度確認する。
- Max Load Collision Distance(m):対象領域内に読み込み済みの LCC コリジョンが存在するかを決める
- NavMeshBoundsVolume:Unreal Engine がどの境界内で NavMesh を構築するかを決める
一方の範囲だけを大きくしても、もう一方の範囲が覆っていない問題は解決しない。
4. Navigation System を設定する
| 設定 | 推奨値 | 説明 |
|---|---|---|
| Runtime Generation | Static | 第一候補の設定。ナビゲーションはエディターでの構築時にのみ生成され、実行時に再構築が続いてパフォーマンスコストが生じるのを避けられる |
| Cell Size | 既定値 | 値が小さいほど NavMesh は正確になるが、構築時間、メモリ、実行時のコストが大きくなる |
Dynamic を使うのはどんなときか
NavMesh を実行時にジオメトリの変化に応じて自動で再構築する必要が実際にある場合にのみ Dynamic を検討する。たとえば実行時に歩行可能な領域が変化するインタラクティブなシーンである。
LCC のコリジョンと Dynamic を組み合わせるときは特に慎重にする。コリジョン自体がブロック単位の動的読み込みであり、コリジョンブロックが入れ替わるたびにジオメトリの変化と判定されてナビゲーションの再構築がトリガーされるため、大規模シーンでは CPU コストとカクつきが続く可能性がある。Dynamic がどうしても必要な場合は、あわせてコリジョンの読み込み範囲を活動領域全体を覆うまで大きくし、実行時にコリジョンの変化が起きないようにする。
コリジョン距離やナビゲーションの被覆範囲を広げるためだけに Dynamic を有効にしてはいけない。
5. コリジョンの準備を待って Static NavMesh を構築する
推奨の Static モードを使う場合は、次の順で操作する。
- LCC データを読み込み、3DGS の画面が表示されていることを確認する。
- 非同期のコリジョンのベイクが完了するまで待つ。
- Player Collision または Visibility Collision モードで、対象領域内のコリジョンが読み込まれていることを確認する。
- Collision Load Max Distance と
NavMeshBoundsVolumeの両方が対象領域を覆っていることを確認する。 - Unreal Engine のメインメニューで Build → Build Paths を実行する。
- ナビゲーションの構築が完了するまで待つ。
- レベルとナビゲーションデータを保存する。
検証とトラブルシューティング
P キーを押すとビューポートに NavMesh が表示される。
- 緑色の領域:歩行可能な NavMesh が生成されている
- 緑色の領域がない:その位置に NavMesh が生成されていないので、以下の順で確認する

P キーで NavMesh を検証する。緑色に覆われている領域は歩行可能なナビゲーションデータが生成されていることを示す
対象の位置に緑色の NavMesh がない場合は、順に確認する。
- データにコリジョンが含まれているか:使用しているのが
.lccまたは.lcc2で、データディレクトリに対応するコリジョンファイルがあることを確認する。単一ファイル形式はコリジョンを含まないため、本編の手順は使えない。 - コリジョンが有効で読み込まれているか:
bEnableCollision = true、CanEverAffectNavigation = trueを確認し、Player Collision または Visibility Collision モードで対象位置のコリジョンボディが見えることを確認する。 - コリジョンの読み込み範囲が十分か:対象位置が読み込み範囲を超えている場合は
Max Load Collision Distance(m)を大きくし、コリジョンが再度準備されるのを待つ。 - NavMeshBoundsVolume が対象位置を覆っているか:Volume を移動または拡大縮小し、ナビゲーションの構築境界が対象領域を完全に覆うようにする。
- Static NavMesh を再構築したか:コリジョンと範囲に問題がないと確認できたら Build → Build Paths を実行し、完了を待ってレベルとナビゲーションデータを保存する。
- 再度 P を押して緑色の被覆を確認する。
以上がすべて正しくても生成できない場合は、Output Log の Navigation、Recast、コリジョン関連のエラーをさらに確認し、現在のレベルが保存されていることを確かめる。