繼續介紹NavMesh尋路的功能,接下來阿趙打算講一下如下兩個例子,先看看完成的效果:動畫
第一個例子對於喜歡DOTA的朋友應該很熟悉了,就是不一樣小隊分不一樣路線進攻的尋路,紅綠藍三個隊伍分別根據三條路線進攻。設計
第二個例子是動態的控制道路的開關。當吊橋打開時,道路不通,當吊橋放下時,道路能夠通行。教程
先來講說第一個例子吧,第一個例子其實很簡單,只須要在以前兩節的基礎上修改一下層的設置就能夠了。文檔
先來分析一下咱們的地形,爲了作這個例子,我準備了兩個plane分別做爲我方基地和地方基地,而後用plane簡單的拼了三條線路。it
在我方基地,準備了紅綠藍各三個的小兵(用膠囊代替)。固然小兵身上帶着NavMesh Agent組件io
若是把兩個plane和三條線路都打上Navigation static的話,就和普通的尋路沒有區別,三條路都能走。接下來咱們進行層的設置。入門
還記得第一節裏面講過的怎麼設置NavMeshLayer吧?基礎
如今咱們須要設置Red、Blue和Green三個層,如上圖所示。date
如今,咱們能夠選擇路線一,而後在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文檔裏面有具體的說明,有興趣能夠具體去看看,我就不一一解釋。有不少變化的用法,各位能夠本身嘗試一下。謝謝你們的支持!