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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00145.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

Game Play Maker : [轉貼]unity 自帶尋路 Navmesh 入門教程(一)

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]unity 自帶尋路 Navmesh 入門教程(一)

說明:從今天開始,我阿趙打算寫一些簡單的教程,方便自己日後回顧,或者方便剛入門的朋友學習。水平有限請勿見怪。不過請尊重碼字截圖錄屏的勞動,如需轉載請先告訴我。謝謝!

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

unity自從3.5版本之後,增加了NavMesh尋路的功能。在此之前,unity用戶只能通過第三方插件(如Astar尋路插件)等做尋路功能。阿趙我也使用過A*尋路插件,A*的原理並不複雜,有興趣的朋友可以自己百度一下。不過由於不是自帶的功能,所以在設定網格和烘焙的過程難免會出現很多不便。NavMesh作為unity自帶的功能,用法和之前的LightMapping烘焙或者遮擋剔除Occlusion Culling有很多相似之處。

這個功能有很多有趣的地方,而且用起來也很方便,我打算分開幾篇日誌來逐一介紹。這次的目的只是簡單的認識一下NavMesh的基本用法,所以暫時不詳細的翻譯組件每一個參數和功能的意思。

先來看看怎麼在unity打開NavMesh功能的窗口吧:


在window下拉列表中可以看到Navgation,點擊:

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
在原來Inspector面板的旁邊會出現Navigation的面板:
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
這個Objcet的面板是對應當前選擇的物體的,旁邊的Bake面板是對應全局選項的。結構和烘焙或者遮擋剔除是一樣的。在選擇了物體的情況下會出現上面的內容:
上面的All、MeshRenderers、Terranis是對Hirarchy面板裡面顯示的物品選擇的一個篩選過濾:
all就是全部顯示
MeshRenderers是只顯示可渲染的網格物體
而Terrains當然就是只顯示地形物體了。
下面的是重要的選項,第一個Navigation Static選項是選擇該物體是否用做尋路功能的一部分。只有勾選了這個選項,下面的其他選項才會可操作。

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
OffMeshLink Generation選項是選擇該物體是否根據高度、可跳躍頻寬等全局的選項自動生成OffMeshLink,這個會在以後的講解中詳細說明,這次就暫時不討論。
Navigation Layer是對參與尋路功能的地圖物體的一個分類,用層來分類,默認有三個層可以選擇,當然也可以自己添加層。
舊版本:在Edit下拉列表,選擇Project——NavMeshLayers
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙

注意:在4.幾的新版本後,這個尋路層管理打開的位置發生了變化,變成了在 Navigation 面板裡面了:

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 窮到掉渣的超級奶爸阿趙
出現了NavMesh層的管理界面:
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
上面三個Buit-in Layer是系統默認的三個可選擇層,我們可以在下面的User Layer裡面輸入自己需要的層的名稱,比如我現在輸入一個叫做「brigde」的層
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
這時候,剛才輸入的「bridge」層,就會出現在可選擇的列表裡面
通過剛才的幾步,NavMesh常用的幾個面板我們都已經操作過了,接下來可以做一個小例子:

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
在場景裡面,我放了一個攝像機(Camera),一個充當地面的面片(plane),一個角色模型(man)和一個目標點物體(target)
為了便於觀察目標點的位置,我在目標點物體身上添加了Light組件讓它會發光。角色模型(man)身上必須添加NavMesh組件,不然就不能尋路了。為了方便,我使用了官方的大兵模型,裡面已經帶有了動畫和動畫控制的腳本。不過這些動畫的表現暫時是不重要的,你可以選擇放一個膠囊或者Cube代替人物的模型。
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
還記得剛開始介紹的Navigation面板嗎?選擇地面(plane),在Navigation面板裡面裡面勾選Navigation Static選項,其他的默認不改動。
然後點擊右下角的Bake面板。這時候會有一個計算的過程,曾經用過烘焙或者遮擋剔除的朋友應該對這個過程很熟悉了。
不過和之前兩個功能一樣,如果你沒有保存場景level,unity會提示你先保存,然後再bake。
由於現在場景裡面的物體很少,所以Bake的過程很快就結束了。

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
留意看scene視窗,現在地面的顏色已經發生改變了,這是因為unity已經幫你生成了尋路用的NavMesh網格,由於現在沒有遮擋的阻礙物,所以整個地面都是屬於可以行走的範圍。
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
寫一個最簡單的控制腳本吧,以上是C#,由於很簡單,估計用Js的朋友也能對應的寫出來。
簡單的解釋一下,這個腳本是直接拖放到角色(man)身上的,並把場景中的目標物體(target)拖放指定到該腳本的target變量上面進行了賦值。在腳本一開始的時候,我 先獲取了man身上的NavMeshAgent腳本組件,然後在Update的過程中,man不斷的進行對target的位移的一個尋路並移動到目標位置的操作。
在進行完以上的操作後,你應該已經可以點擊unity的播放按鈕,然後移動目標物體(target),這時候角色模型已經可以追著目標點跑了。
這裡我還做了一個簡單的鼠標點擊plane設定目標點的功能,由於這個功能不在這次的討論範圍內,所以有興趣的朋友可以自己去百度一下具體的方法。

unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
進行到這一步,人物已經跑起來了,但由於沒有遮擋的障礙物,所以人物只是會直線的行走,看不出尋路的感覺。接下來我們就做點更複雜的:
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
在場景裡面添加一個Cube做為障礙物,具體的形狀和位置請根據自己喜歡來調節,阿趙我是把它做成了一個長方形,並擺在了角色面前。
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
和剛才對地面的操作差不多,選擇遮擋物Cube,在Navigation面板裡面勾選Navigation Static選項,這次的Navigation Layer要選擇Not Walkable。顧名思義,這是不能行走的意思,代表了這個Cube是不能通過的。
選擇完成後,我們再次點擊Bake,又是一個小等待的過程。
Bake完成後,我們回到scene視窗。
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
觀察scene視窗,會發現剛才整個地面都是NavMesh的情況已經改變了,在障礙物的周圍,NavMesh留出了一個缺口,這代表了角色已經不能從障礙物身上通過了。
再次點擊unity的播放按鈕
unity自帶尋路Navmesh入門教程(一) - 阿趙 - 有爪的小羔羊阿趙
現在可以看到,人物已經可以繞著障礙物走了,我們的目的已經順利達到了。
這次的例子就到此結束了。
在第二節裡,我會詳細的講解高低落差、爬梯子以及跳躍等較為複雜一點的功能。然後會在第三節裡面講解分條件的尋路(不同人走不同的路),以及動態控制道路(如吊橋)等的功能。
第一次寫教程,可能有些不太人性化的地方,請各位諒解。
再次提醒,請體諒作者辛苦,如需轉載,請通知我,我是阿趙,謝謝!


原文出處:unity自带寻路Navmesh入门教程(一) - 阿赵的日志 - 网易博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]unity 自帶尋路 Navmesh 入門教程(二)

上一節簡單介紹了NavMesh尋路的基本用法,這次來介紹一下稍微複雜一點點的高低落差以及跳躍的做法,首先來看看這次的目標:

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

由於博客相冊上傳GIF有限制,所以我把整個過程切開了2部分上傳,第一部分是爬樓梯,第二部分是橫向跳躍和往下跳落

不管是爬樓梯,還是跳躍,NavMesh都是通過了OffMeshLink來做的。創建OffMeshLink的方法有兩種,接下來會通過製作上面的例子來進行說明:


unity自帶尋路Navmesh入門教程(二) - 阿趙 - 有爪的小羔羊阿趙
為了做這個例子,我們預先在場景裡面準備了一些物體:攝像機是必須的,一個作為地面的Plane,然後是F1——F5幾個高低落差不一樣的台階,L1和L2是樓梯模型, 控制人物主體man,還有移動的目標點target。
其中man身上必須帶有NavMesh Agent組件,為了觀察方便在target身上帶了light組件。
unity自帶尋路Navmesh入門教程(二) - 阿趙 - 有爪的小羔羊阿趙

按照上一節所講的,plane和F1——F5台階在Navigation面板勾選Navigation Static選項,然後Bake,觀察Scene視窗,會發現已經生成了我們所要的NavMesh網格,現在我們可以像上一節那樣在plane上面給人物做尋路和移動了,但人物是不會爬樓梯的。

這時候,我們找到L1樓梯,在樓梯的開始和結束的位置放置兩個點,這兩個點只需要拾取它的位移的,你可以用empty Gameobject來做,我這裡為了便於觀察,就拿了cube來做。開始點命名為startPoint,結束點命名為endPoint。


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

注意:startPoint和endPoint的位置要稍微比所在的平面高一點點。

接下來介紹第一種生成OffMeshLink的方法。選擇L1樓梯,然後在Component下拉選項中選擇Navigation——Off Mesh Link。

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

選擇後,OffMeshLink組件已經添加到了L1的身上,我們可以在Inspector面板看到:

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

我們把剛才放置在場景裡面的startPoint和endPoint指定到OffmeshLink組件的Start和End位置,其他選項默認不改變

再次Bake


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

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

現在我們發現,在scene面板裡面,在startPoint和endPoint之間生成了一條線,而方向是從startPoint指向endPoint的。

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

這時候,你應該可以通過移動目標點讓角色開始爬樓梯了。但爬上去之後角色暫時不能跳下來,如果把目標點移動到plane上,角色會順著樓梯爬下來。

我們使用同樣的方法對L2進行生成OffMeshLink。這時候,角色應該可以爬兩層樓梯了。到此第一個目標完成了。

接下來我們進行第二個目標的製作,首先先來分析一下我們的場景:


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

我們希望人物能從2.5M的高度往下跳,超過2.5M人物就不能跳了,太高會有危險。然後橫向我們希望人物能跳過2米的溝。

根據這個設定,我們的場景會是這樣的情況:L1和L2只能通過爬樓梯,L2和L3之間可以跳躍,L3——L5是可以往下跳的。

於是,我們在Navigation面板裡面找到Bake欄,Drop Height(掉落高度)填2.5,Jump Distance(跳躍距離)填2,單位都是米

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

接下來介紹第二種生成OffMeshLink的方法:

我們把L1——L5的物體選中,在Navigation面板的Object欄裡面把OffMeshLink Generation選項打上勾

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


再次Bake,回到scene視窗:

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

這時候,場景裡面會出現很多心的OffMeshLink,這是unity通過計算,把可以跳躍或者下落的地方自動生成了OffMeshLink了。

這時候,你應該已經可以通過移動目標點,讓角色進行跳躍和下落了。

進行到這裡,我們的第二個目標也完成了。

不過有些朋友可能會提出疑問,在做的過程中,假如沒有這個大兵的模型,而是用一個膠囊體來代替人物的話,它爬樓梯和跳躍的時候好像是在一瞬間完成的,沒有大兵那個爬樓梯和跳躍動作的過程。如這樣:

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

的確是這樣,因為默認的NaveMesh Agent組件上面是勾選了Auto Traverse Off Mesh Link(自動通過OffMeshLink)選項的。這樣的意思是人物只要到了OffMeshLink的開始點,就會自動的移動到OffMeshLink的結束點。
unity自帶尋路Navmesh入門教程(二) - 阿趙 - 有爪的小羔羊阿趙

假如各位需要對越過OffMeshLink時候進行自己的控制,是需要另外寫腳本的。我這裡簡單的介紹一下方法,有興趣的朋友可以自己試試。

首先各位最好有用狀態來控制角色的概念。比如人物可以分為站立、走路、跑步、上下樓梯、橫向跳躍和往下掉落幾種狀態,針對NavMesh來說,人物簡單的可以分為站立、正常的NavMesh尋路,和通過OffMeshLink移動幾種狀態。

先把 Auto Traverse Off Mesh Link選項取消。

然後,當人物在通過OffMeshLink移動的狀態(可以用NavMeshAgent.isOnOffMeshLink來判斷),獲取到當前通過的OffMeshLink:

OffMeshLinkData link = NavMeshAgent.currentOffMeshLinkData;

這樣你就能獲取到link的開始點和結束點的坐標(link.startPos和link.endPos),這時候你的人物就可以用最簡單的Vector3.Lerp來進行移動,當人物的位移到達了結束點的坐標,人物的OffMeshLink移動狀態就可以結束,又重新變回正常尋路或者站立的狀態了。在這個Vector3.Lerp的過程中,你可以隨意的控制人物的爬行或者跳躍的動作。


到這裡,第二節的內容結束了。到現在,各位應該已經可以基本掌握了NavMesh尋路的全部正常操作了。接下來,我會在第三節裡面簡單講解一下NavMesh的稍微複雜的控制方法,希望大家繼續支持阿趙。

順帶一提,可能很多朋友希望我把工程文件提供下載。不過我覺得這樣並不是一件好事,因為這幾個例子都是很簡單的操作,如果各位有耐心跟著阿趙一步步的做下來,應該可以得到你想要的結果。而如果沒有耐心一步步的看下來,直接看工程文件,可能會忽略了很多重要的步驟的。


原文出處:unity自带寻路Navmesh入门教程(二) - 阿赵的日志 - 网易博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]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文檔裡面有具體的說明,有興趣可以具體去看看,我就不一一解釋。有很多變化的用法,各位可以自己嘗試一下。謝謝大家的支持!


原文出處:unity自带寻路Navmesh入门教程(三) - 阿赵的日志 - 网易博客
前一個主題 | 下一個主題 | 頁首 | | |



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