Unity NavMesh 教學

NavMesh 用於找尋路徑與可步行性測試、為特定區域類型設置尋路成本,並調整尋路與避障的行為,使用空間查詢 ( Spatial queries ) 功能之前,必須先將 NavMesh 烘焙到場景。

從遊戲場景創建 NavMesh 的過程稱為 NavMesh Baking 烘焙導航網格,透過收集網格與地形標記為 "Navigation Static" 的 3D 遊戲物件,參考這些物件來創建遊戲角色可移動的特定區域。

當開啟 NavMesh 視窗時,導航網格將會在場景中與 3D 物件重疊顯示(藍色區域)。

本教學將使用 Standard Assets 的遊戲角色進行示範,建立玩家角色與跟隨玩家的 NPC 角色。

 

NavMesh 官方教學

Building NavMesh - Unity Manual [ 連結 ]

Scripting API: NavMesh - Unity [ 連結 ]

 

製作玩家與 NPC 遊戲角色

首先匯入標準資源資源包並製作一個簡單遊戲場景。

開啟 [ Standard Assets > Characters > ThirdPersonCharacter > Prefabs ] 資料夾,將 ThirdPersonController 預製物件拖曳到遊戲場景。

這是可讓玩家控制的遊戲角色,重新命名為「Player」。

接著在相同的資料夾,將 AIThirdPersonController 預製物件拖曳到遊戲場景。這是 AI 控制的角色,重新命名為「NPC」。

此時按 Play 測試遊戲,將會持續出現以下錯誤訊息,這是因為 AIThirdPersonController 需要 NavMesh 導航網格。
"GetRemainingDistance" can only be called on an active agent that has been placed on a NavMesh.

我們需要在場景建立 NavMesh 導航網格,選取場景中的地板、牆壁、障礙物,透過 Inspector 屬性編輯器勾選 Navigation Static 設為導航的靜態物件。

執行 [ Window > Navigation ] 開啟 Navigation 面板,先切換到 Bake 分頁。按下 Bake 烘焙建立生預設的 NavMesh 導航網格。

再次測試遊戲,雖然錯誤訊息不再出現,但因為尚未指定跟隨的目標,所以 NPC 並不會移動。

NPC 的 AICharacterControl 腳本元件有個 Target 變數,將 Player 拖曳到 Target 變數欄位。

再次 Play 測試遊戲,若無其他問題 NPC 將會跟隨 Player 移動。

當場景有多個 NavMesh 導航網格,或是導航網格之間有高低落差時,NPC 可能移動範圍受限或需要繞遠路。

設定 Generated Off Mesh Links 下方的 Drop Height 跳下高度(預設值 = 0 ,請自行增加)。

選取需要加連結的物件,切換到 Object 分頁勾選 Generate OffMeshLinks 後回 Bake 分頁重新產生導航網格。

 

 

選取場景中的地板與障礙物,透過 Inspector 屬性編輯器勾選 Navigation Static 設為導航的靜態物件。

 

按下 Bake 烘焙,產生遊戲場景的 NavMesh 導航網格。

 

選取遊戲角色,增加 NavMeshAgent 導航網格代理元件。

 

開啟 Animator 視窗,新增一個 Move (float) 參數,此參數用於控制待機與移動的動畫轉換條件。

 

設定從 Idle 待機到 Move 移動的條件為 Move > 0.1 時轉換為 "移動" 的動作,取消 Has Exist Time 。

 

設定從 Move 移動到 Idle 待機的條件為 Move < 0.1 時轉換為 '待機" 的動作,取消 Has Exist Time 。

 

 

建立一個用於控制玩家角色的 C# 腳本,命名為 "PlayerController" 。

 

將 PlayerController 角本套用到玩家角色。

 

按下 Play 測試遊戲,使用滑鼠點擊場景的適當位置,玩家角色將會自動循路移動到點擊處。

 

玩家經過天橋。

 

玩家角色正確到達點擊處。

 

如果需要讓點擊的位置出現引導箭頭,修改腳本的程式碼。

 

將箭頭的預製物件拖曳到 Arrow Prefab 欄位,按下 Play 測試遊戲確認點擊時是否出現指示箭頭。

 

希望這個 NavMesh 教學讓大家瞭解 NavMesh AI 的基本使用方法,有空再分享進階教學喔!