Unity-導(dǎo)航區(qū)域和成本
導(dǎo)航區(qū)域 (Navigation Areas)?定義了穿越特定區(qū)域的難度,在尋路期間將優(yōu)先選擇成本較低的區(qū)域。此外,每個導(dǎo)航網(wǎng)格代理 (NavMesh Agent) 都有一個_區(qū)域遮罩 (Area Mask)_,可用于指定代理可以移動的區(qū)域。

在上面的示例中,區(qū)域類型用于兩種常見用例:
Water?區(qū)域:通過分配更高的成本使該區(qū)域的行走成本更高,從而應(yīng)對在淺水上行走速度較慢的情況。
Door?區(qū)域:讓該區(qū)域可由特定角色訪問,從而創(chuàng)建人類可以但僵尸不能穿過門的情況。
可將區(qū)域類型分配給導(dǎo)航網(wǎng)格烘焙中包含的每個對象,此外,每個網(wǎng)格外鏈接都有一個屬性用于指定區(qū)域類型。
尋路成本
簡而言之,通過成本可以控制尋路器 (pathfinder) 在尋路時(shí)優(yōu)先選擇的區(qū)域。例如,如果將某個區(qū)域的成本設(shè)置為 3.0,則意味著跨越該區(qū)域的行程將是其他替代路線的三倍。
要完全了解成本的作用,讓我們來看看尋路器的工作原理。

Unity 使用 A* 計(jì)算導(dǎo)航網(wǎng)格上的最短路徑。A* 適用于具有連接節(jié)點(diǎn)的圖形。算法從距離路徑起點(diǎn)最近的節(jié)點(diǎn)開始訪問連接節(jié)點(diǎn),直至到達(dá)目標(biāo)。
由于 Unity 導(dǎo)航表示形式為多邊形網(wǎng)格,因此尋路器首先要做的是在每個多邊形上放置一個點(diǎn),這便是節(jié)點(diǎn)的位置。隨后將計(jì)算這些節(jié)點(diǎn)之間的最短路徑。
上圖中黃色的點(diǎn)和線顯示了節(jié)點(diǎn)和鏈接在導(dǎo)航網(wǎng)格上的分布情況,以及在 A* 期間遍歷這些節(jié)點(diǎn)和鏈接的順序。
在兩個節(jié)點(diǎn)之間移動的成本取決于行進(jìn)距離以及與該鏈接下的多邊形的區(qū)域類型相關(guān)聯(lián)的成本,即_距離 * 成本_。實(shí)際上,這意味著,如果一個區(qū)域的成本為 2.0,則此類多邊形的距離將顯示為兩倍。A* 算法要求所有成本必須大于 1.0。
成本對最終路徑的影響可能難以調(diào)整,尤其是對于較長的路徑。使用抵達(dá)成本的最佳方式是將其視為提示。例如,如果您希望代理不要經(jīng)常使用網(wǎng)格外鏈接,可增加這些鏈接的成本。但是,調(diào)整代理偏好在人行道上行走的行為可能存在挑戰(zhàn)性。
在某些關(guān)卡中,您可能會注意到的另一個現(xiàn)象是尋路器并不總是選擇最短的路徑。此現(xiàn)象的原因在于節(jié)點(diǎn)的放置方式。在以下場合中,該現(xiàn)象可能會很明顯:大型開放區(qū)域與微小障礙物相鄰,從而造成導(dǎo)航網(wǎng)格具有非常大和非常小的多邊形。在這種情況下,大型多邊形上的節(jié)點(diǎn)可能放置在大型多邊形的任何位置,從尋路器的角度看起來好像是繞行道。
可在?Areas?選項(xiàng)卡中設(shè)置每種_區(qū)域類型_的_成本_,也可使用腳本根據(jù)每個代理覆蓋這些設(shè)置。
區(qū)域類型

應(yīng)在?Navigation 窗口_的?Areas_ 選項(xiàng)卡中指定區(qū)域類型。此處提供了 29 個自定義類型和 3 個內(nèi)置類型:_Walkable、Not Walkable_ 和?Jump。
Walkable?是一種可行走的通用區(qū)域類型。
Not Walkable?是一種禁止導(dǎo)航的通用區(qū)域類型。如果希望將某個對象標(biāo)記為障礙物,但不將導(dǎo)航網(wǎng)格置于其上,則可使用該類型。
Jump?是分配給所有自動生成的網(wǎng)格外鏈接的區(qū)域類型。
如果不同區(qū)域類型的多個對象重疊,則生成的導(dǎo)航網(wǎng)格區(qū)域類型通常是索引最高的類型。但有一個例外:_Not Walkable_ 始終優(yōu)先。如果需要阻擋某個區(qū)域,此類型可能會有用。
區(qū)域遮罩 (Area Mask)

每個代理都有一個_區(qū)域遮罩 (Area Mask)_,用于描述代理在導(dǎo)航時(shí)可使用的區(qū)域??稍诖韺傩灾性O(shè)置區(qū)域遮罩,也可在運(yùn)行時(shí)使用腳本來操作位掩碼。
當(dāng)您希望只有某些類型的角色才能穿過某個區(qū)域時(shí),區(qū)域遮罩非常有用。例如,在僵尸逃避游戲中,可使用?Door?區(qū)域類型來標(biāo)記每個門下方的區(qū)域,并從僵尸角色的 Area Mask 中取消選中 Door 區(qū)域。