unity自帶尋路Navmesh入門教程(三)


繼續介紹NavMesh尋路的功能,接下來阿趙打算講一下以下兩個例子,先看看完成的效果:

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙 
unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 第一個例子對於喜歡DOTA的朋友應該很熟悉了,就是不同小隊分不同路線進攻的尋路,紅綠藍三個隊伍分別根據三條路線進攻。

第二個例子是動態的控制道路的開關。當吊橋打開時,道路不通,當吊橋放下時,道路可以通行。

先來說說第一個例子吧,第一個例子其實很簡單,只需要在之前兩節的基礎上修改一下層的設置就可以了。

 

先來分析一下我們的地形,為了做這個例子,我准備了兩個plane分別作為我方基地和地方基地,然后用plane簡單的拼了三條線路。

在我方基地,准備了紅綠藍各三個的小兵(用膠囊代替)。當然小兵身上帶着NavMesh Agent組件unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 如果把兩個plane和三條線路都打上Navigation static的話,就和普通的尋路沒有區別,三條路都能走。接下來我們進行層的設置。

 

還記得第一節里面講過的怎么設置NavMeshLayer吧?

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 現在我們需要設置Red、Blue和Green三個層,如上圖所示。

 

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 現在,我們可以選擇路線一,然后在Navigation Layer里面選擇Red層了。相應的,路線二選擇Blue層,路線三選擇Green層

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 Bake出來后,會是上面的效果。

 

道路已經設置好了接下來我們對小兵身上的NavMesh Agent組件進行設置

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

選擇藍色的小兵,然后找到NavMesh Agent組件里面的NavMesh Walkable選項,這里就是人物能通過的層的選擇了。按照剛才層的設計,藍色的小兵需要勾選Blue層 ,把Red層和Green層取消選擇。

 

同理,把紅色小兵和綠色小兵的NavMesh Walkable層處理一下。

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙

 現在,我們可以運行了,移動目標點到敵方基地,三種不同顏色的小兵就會根據不同的路線尋路進攻了。

unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙
我們第一個目標也就完成了。
 
 
接下來說一下第二個例子
unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙
這個例子我准備了兩個平台,中間是一個活動的吊橋,一個帶NavMesh Agent組件的角色模型,一個目標點
如果按照之前的操作,我們可以輕易的讓角色在任意位置尋路,但為了讓吊橋升起的時候角色不能通過吊橋,我們需要對吊橋的NavMesh層進行一些設置。
 
unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙
和剛才一樣,我們要預先設置了一個叫做bridge的層(在第一節的時候做過)。
 
 
unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙
同樣的,吊橋選擇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)都可以讓玩家通過。
unity自帶尋路Navmesh入門教程(三) - 阿趙 - 有爪的小羔羊阿趙
 
從自定義層的界面我們可以總結一下,每一個層的可通過值,其實就是全面所以層的值相加的總和再加1。或者說是2的(n-1)次方。
除了指定本身的層意外,還可以指定多個層,比如這里假如你想mix一個Default和bridge層都能通過,你可以設定walkableMask = 9,也就是1+8。
 
 
      到此為止,阿趙我對於Unity自帶的NavMesh尋路的介紹就結束了。至於NavMesh或者NavMesh Agent組件的各個屬性和方法,API文檔里面有具體的說明,有興趣可以具體去看看,我就不一一解釋。有很多變化的用法,各位可以自己嘗試一下。謝謝大家的支持!

 

轉自:http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM