茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1675086 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
HoneyMoon_Day3_00030.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2015/3/27 10:52:42

繼續介紹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文檔裡面有具體的說明,有興趣可以具體去看看,我就不一一解釋。有很多變化的用法,各位可以自己嘗試一下。謝謝大家的支持!


原文出處:unity自带寻路Navmesh入门教程(三) - 阿赵的日志 - 网易博客
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|