unity自帶尋路(導航)系統 Nav Mesh導航網格

本文為大傢分享瞭unity自帶尋路(導航)系統的具體代碼,供大傢參考,具體內容如下

一、介紹

unity官方文檔:

導航網格(即 Navigation Mesh,縮寫為 NavMesh)是一種數據結構,用於描述遊戲世界的可行走表面,並允許在遊戲世界中尋找從一個可行走位置到另一個可行走位置的路徑。該數據結構是從關卡幾何體自動構建或烘焙的。

我們可以這麼理解:它是unity官方自帶的一種尋路系統。我們可以通過它來制作簡單的尋路,比如可以制作點擊某個位置,讓角色自動的繞開障礙走到目標點的效果,比如可以制作敵人AI,讓它可以通過NavMesh繞開障礙追擊我方單位。甚至可以在NavMesh中設置傳送門,跳躍的起點落點,讓這些效果也參與尋路的計算,成功計算出導航的捷徑。

二、簡單使用介紹

簡單搭一個場景,創建player和target
//藍–Player 紅–Target

點擊window–windows–Navigation

在Player身上掛載Nav Mesh Agent組件
導航網格代理 (NavMesh Agent) 組件可幫助您創建在朝目標移動時能夠彼此避開的角色。代理使用導航網格來推斷遊戲世界,並知道如何避開彼此以及移動的障礙物。

點擊地面cube,點擊Static旁邊小箭頭,設置為Navigation Static

點擊Navigation,點擊Bake

可以看到場景中物體可以移動的敵方被烘焙成藍色

如果此處未烘焙成功,首先檢查是否將地面設置成Static
再看Scene窗口Gizmos設置,或許是已經烘焙成功瞭但是沒有顯示

寫一個簡單的腳本掛載在Player小球身上,告訴它它的目標點在哪

獲取到Agent組件,通過agent.destination設置目標點,記得將目標點的藍色方塊拖拽進腳本

using UnityEngine;
using UnityEngine.AI;

public class Player : MonoBehaviour
{
 private NavMeshAgent agent;
 public Transform target;

 void Start()
 {
  agent = GetComponent<NavMeshAgent>();
  agent.destination = target.position;
 }
}

這樣的話就實現瞭一個簡單的尋路小demo

三、功能詳細介紹(unity2019.4)

導航網格代理 (NavMesh Agent)

Agent Type 來自Navigation,可以設置多個不同的Type。
==Base offset ==碰撞圓柱體相對於變換軸心點的偏移。
Steering
Speed 最大移動速度(以世界單位/秒表示)。
Angular Speed 最大旋轉速度(度/秒)。
Acceleration 最大加速度(以世界單位/平方秒表示)。
Stopping distance 當靠近目標位置的距離達到此值時,代理將停止。
Auto Braking 啟用此屬性後,代理在到達目標時將減速。對於巡邏等行為(這種情況下,代理應在多個點之間平滑移動)應禁用此屬性

Obstacle Avoidance
Radius 代理的半徑,用於計算障礙物與其他代理之間的碰撞。
Height 代理通過頭頂障礙物時所需的高度間隙。
Quality 障礙躲避質量。有五個選項從None到High Quality,如果擁有大量代理,則可以通過降低障礙躲避質量來節省 CPU 時間。如果將躲避設置為None,則隻會解析碰撞,而不會嘗試主動躲避其他代理和障礙物。
Priority 執行避障時,此代理將忽略優先級較低的代理。該值應在 0–99 范圍內,其中較低的數字表示較高的優先級。

Path Finding
Auto Traverse OffMesh Link 設置為 true 可自動遍歷網格外鏈接 (Off-Mesh Link)。如果要使用動畫或某種特定方式遍歷網格外鏈接,則應關閉此功能。
Auto Repath 啟用此屬性後,代理將在到達部分路徑末尾時嘗試再次尋路。當沒有到達目標的路徑時,將生成一條部分路徑通向與目標最近的可達位置。
Area Mask Area Mask 描述瞭代理在尋路時將考慮的區域類型。在準備網格進行導航網格烘焙時,可設置每個網格區域類型。例如,可將樓梯標記為特殊區域類型,並禁止某些角色類型使用樓梯。(比如,我想讓A可以爬樓梯,B不可以爬,就可以調整Area Mask做到此效果)

導航網格障礙物 (NavMesh Obstacle)

Shape 可選Capsule或者Box決定障礙的形狀
選Box:
Center 定障礙位置
Size 定障礙大小
選Capsule
Center 定障礙位置
Radius 定障礙半徑
Height 膠囊體的高度

Carve
勾選 Carve 復選框後,導航網格障礙物會在導航網格中創建一個孔。
Move Threshold 當導航網格障礙物的移動距離超過 Move Threshold 設置的值時,Unity 會將其視為移動狀態。使用此屬性可設置該閾值距離來更新移動的雕孔。
Time To Stationary 將障礙物視為靜止狀態所需等候的時間(以秒為單位)。
Carve Only Stationary 啟用此屬性後,隻有在靜止狀態時才會雕刻障礙物

考慮到性能因素和本身導航的局限性,需要多進行實踐來調整具體使用的參數。

網格外鏈接 (Off Mesh Link)

Start 描述網格外鏈接起始位置的對象。
End 描述網格外鏈接起始位置的對象。
Cost Override 如果值為正,則在計算處理路徑請求的路徑成本時使用該值。否則,使用默認成本(此遊戲對象所屬區域的成本)。如果 Cost Override 設置為值 3.0,則在網格外鏈接上移動的成本將是在默認導航網格區域上移動相同距離的成本的三倍。如果希望讓代理通常優先選擇步行,但當步行距離明顯更長時使用網格外鏈接,則 Cost Override 設置將變得有用。
Bi-Directional 如果啟用此屬性,則可以在任一方向上遍歷鏈接。否則,隻能按照從 Start 到 End 的方向遍歷鏈接。
==Activated ==指定尋路器 (pathfinder) 是否將使用此鏈接(如果將此屬性設置為 false,則將忽略它)。
Auto Update Positions 如果啟用此屬性,當端點移動時,網格外鏈接將重新連接到導航網格。如果禁用,即使移動瞭端點,鏈接也將保持在其起始位置。
Navigation Area 描述鏈接的導航區域類型。該區域類型允許您對相似區域類型應用常見的遍歷成本,並防止某些角色根據代理的區域遮罩 (Area Mask) 訪問網格外鏈接。

Bake頁面


可以設置Player的導航高度,半徑,可上的樓梯高度,斜坡角度

Generated Off Mesh Links
烘焙的時候自動構成,上跳和下躍的網格外鏈接

註意:

掉下鏈接的生成由 Drop Height 參數控制。該參數可控制將要連接的最高掉落高度,將值設置為 0 將禁用生成。
定義掉下鏈接的軌跡時應使水平行程 (A) 為:2agentRadius + 4voxelSize。即,掉落將剛好落在平臺的邊緣之外。此外,垂直行程 (B) 需要大於烘焙設置的 Step Height(否則隻會走下平臺)並小於 Drop Height。應按體素大小進行調整,確保在體素化期間的任何舍入誤差都不會阻止生成鏈接。應將 Drop Height 的值設置得比在關卡中測量的值略大,使鏈接正確連接。

跳過鏈接的生成由 Jump Distance 參數控制。該參數可控制將要連接的最遠距離。將值設置為 0 將禁用生成。
定義跳過鏈接的軌跡時應使水平行程 © 大於 2*agentRadius 且小於 Jump Distance。此外,著陸位置 (D) 不得超過距離起始位置關卡的 voxelSize

Areas頁

可以創建不同的Areas,設置不同的Cost,讓角色對經過某些路線進行一個傾向。比如設置敵人雖然可以直接穿過毒氣抓到主角,但是因為毒氣的cost較高,可以讓敵人盡量繞過毒氣去抓主角,但是如果會繞的太遠的話,敵人還是會選擇穿過毒氣。

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: