繼續介紹NavMesh尋路的功能,接下來阿趙打算講一下以下兩個例子,先看看完成的效果:
第一個例子對於喜歡DOTA的朋友應該很熟悉了,就是不同小隊分不同路線進攻的尋路,紅綠藍三個隊伍分別根據三條路線進攻。
第二個例子是動態的控制道路的開關。當吊橋打開時,道路不通,當吊橋放下時,道路可以通行。
先來說說第一個例子吧,第一個例子其實很簡單,只需要在之前兩節的基礎上修改一下層的設置就可以了。
先來分析一下我們的地形,為了做這個例子,我準備了兩個plane分別作為我方基地和地方基地,然後用plane簡單的拼了三條線路。
在我方基地,準備了紅綠藍各三個的小兵(用膠囊代替)。當然小兵身上帶著NavMesh Agent組件 
如果把兩個plane和三條線路都打上Navigation static的話,就和普通的尋路沒有區別,三條路都能走。接下來我們進行層的設置。
還記得第一節裡面講過的怎麼設置NavMeshLayer吧?
現在我們需要設置Red、Blue和Green三個層,如上圖所示。
現在,我們可以選擇路線一,然後在Navigation Layer裡面選擇Red層了。相應的,路線二選擇Blue層,路線三選擇Green層
Bake出來後,會是上面的效果。
道路已經設置好了接下來我們對小兵身上的NavMesh Agent組件進行設置
選擇藍色的小兵,然後找到NavMesh Agent組件裡面的NavMesh Walkable選項,這裡就是人物能通過的層的選擇了。按照剛才層的設計,藍色的小兵需要勾選Blue層 ,把Red層和Green層取消選擇。
同理,把紅色小兵和綠色小兵的NavMesh Walkable層處理一下。
現在,我們可以運行了,移動目標點到敵方基地,三種不同顏色的小兵就會根據不同的路線尋路進攻了。
我們第一個目標也就完成了。
接下來說一下第二個例子
這個例子我準備了兩個平台,中間是一個活動的吊橋,一個帶NavMesh Agent組件的角色模型,一個目標點
如果按照之前的操作,我們可以輕易的讓角色在任意位置尋路,但為了讓吊橋升起的時候角色不能通過吊橋,我們需要對吊橋的NavMesh層進行一些設置。
和剛才一樣,我們要預先設置了一個叫做bridge的層(在第一節的時候做過)。
同樣的,吊橋選擇bridge層
這裡的操作和上面的例子沒什麼區別,但這次角色身上的NavMesh Walkable不需要設置,直接Everything就行了。
到了這裡,我們需要通過腳本來控制人物是否能通過吊橋。這裡需要用NavMeshAgent.walkableMask來動態修改NavMesh Walkable的值。
關於吊橋怎樣升降,這不是本次討論的內容,你可以選擇直接用位移來控制,或者吊橋直接做好開關的動畫也行。
之前說過,各位最好要有習慣用狀態來控制物體。這裡的吊橋會有2種狀態,一種是開狀態,一種是關狀態。當開狀態時,吊橋斷開,人物不能通行,關狀態時,吊橋閉合,人能通行。給予這兩種狀態,我們給人物身上的NavMeshAgent.walkableMask賦值。
寫一段很簡單的代碼吧:
private bool open = false;
private NavMeshAgent agent;
void Start () {
agent = gameObject.GetComponent<NavMeshAgent>();
}
void Update(){
if(open) agent.walkableMask = 1;
else agent.walkableMask = -1;
}
可以了,就是這麼簡單。
這裡為了簡便,把賦值寫在了UpDate裡面,其實這樣做是不正確的,沒必要每幀都檢測賦值,只需要把這個賦值寫在吊橋開關的控制裡面就行了。
我來解釋一下其中的意思:
定義了一個狀態的開關open,當吊橋打開時open= true;當吊橋閉合時,open = false;至於這個狀態時怎樣賦值的,各位可以自己試試想辦法。
然後假設這個腳本是放置角色身上的,那麼在start的時候就獲取角色身上的NavMesh Agent組件。當然了,你也可以把腳本放在其他的地方,然後通過賦值來指定agent。
當open為true的時候,人物的walkableMask = 1,意思是只有第一層(就是默認的Default)可以讓玩家通行。
當open為false的時候,人物的walkableMask = -1,意思是所有層(Everything)都可以讓玩家通過。
從自定義層的界面我們可以總結一下,每一個層的可通過值,其實就是全面所以層的值相加的總和再加1。或者說是2的(n-1)次方。
除了指定本身的層意外,還可以指定多個層,比如這裡假如你想mix一個Default和bridge層都能通過,你可以設定walkableMask = 9,也就是1+8。
到此為止,阿趙我對於Unity自帶的NavMesh尋路的介紹就結束了。至於NavMesh或者NavMesh Agent組件的各個屬性和方法,API文檔裡面有具體的說明,有興趣可以具體去看看,我就不一一解釋。有很多變化的用法,各位可以自己嘗試一下。謝謝大家的支持!