在 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 |
| 碰撞數據已加載 | 在視圖模式中選擇玩家碰撞或可視性碰撞,可以看到已加載的碰撞體 |
| 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 數據後,在視圖模式中選擇玩家碰撞或可視性碰撞,檢查目標區域內是否已經出現碰撞體。碰撞使用異步物理烘焙,3DGS 畫面開始渲染後仍可能需要等待幾秒才能就緒。

使用玩家碰撞或可視性碰撞模式,確認目標導航區域內的 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 活動區域
再次確認兩個範圍同時滿足要求:
- 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 畫面已經顯示;
- 等待異步碰撞烘焙完成;
- 使用玩家碰撞或可視性碰撞模式,確認目標區域內的碰撞已經加載;
- 確認 Collision Load Max Distance 和
NavMeshBoundsVolume都覆蓋目標區域; - 在 Unreal Engine 主菜單中執行 Build → Build Paths;
- 等待導航構建完成;
- 保存關卡和導航數據。
驗證與排查
按 P 鍵在視口中顯示 NavMesh:
- 綠色區域:已生成可行走 NavMesh;
- 無綠色區域:該位置未生成 NavMesh,需要按下方順序排查。

按 P 鍵驗證 NavMesh;綠色覆蓋表示對應區域已經生成可行走導航數據
如果目標位置沒有綠色 NavMesh,請依次檢查:
- 數據是否包含碰撞:確認使用的是
.lcc或.lcc2,且數據目錄下有對應的碰撞文件;單文件格式不含碰撞,無法用本篇流程; - 碰撞是否啟用並已加載:確認
bEnableCollision = true、CanEverAffectNavigation = true,並在玩家碰撞或可視性碰撞模式下看到目標位置的碰撞體; - 碰撞加載範圍是否足夠:如果目標位置超出加載範圍,增大
Max Load Collision Distance(m)並等待碰撞重新就緒; - NavMeshBoundsVolume 是否覆蓋目標位置:移動或縮放 Volume,使導航構建邊界完整覆蓋目標區域;
- Static NavMesh 是否重新構建:碰撞和範圍確認無誤後,執行 Build → Build Paths,等待完成並保存關卡和導航數據;
- 再次按 P 檢查綠色覆蓋。
以上均正確但仍無法生成時,可進一步檢查 Output Log 中的 Navigation、Recast 和碰撞相關錯誤,並確認當前關卡已經保存。