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的稍微復雜的控制方法,希望大家繼續支持阿趙。

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

 

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


免責聲明!

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



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