西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)西西教程其它教程 → NavMesh尋路網(wǎng)格自動(dòng)生成和動(dòng)態(tài)障礙技術(shù)、Navmesh入門(mén)教程

NavMesh尋路網(wǎng)格自動(dòng)生成和動(dòng)態(tài)障礙技術(shù)、Navmesh入門(mén)教程

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/11/13 15:31:13字體大。A-A+

作者:西西點(diǎn)擊:69次評(píng)論:0次標(biāo)簽: NavMesh

  • 類型:磁盤(pán)工具大。18.8M語(yǔ)言:中文 評(píng)分:5.2
  • 標(biāo)簽:
立即下載

在之前的自己寫(xiě)的NavMesh網(wǎng)格尋路功能的基礎(chǔ)上,做了個(gè)尋路網(wǎng)格動(dòng)態(tài)自動(dòng)生成的功能,突破了Unity的自帶尋路不能動(dòng)態(tài)生成尋路網(wǎng)格,一定要先break再用的缺點(diǎn)。

用法很簡(jiǎn)單,把可以走的地形設(shè)置成一個(gè)叫做“Walk”的標(biāo)簽,然后不能走的地方設(shè)置成叫“cantWalk”的標(biāo)簽,然后就什么都不用管了,直接運(yùn)行即可。

在沒(méi)有任何障礙物的情況下,就和之前的尋路一樣:

然后直接添加一個(gè)cube,尋路就會(huì)繞過(guò)這個(gè)新增加的cube

再增加一個(gè),人物就會(huì)再繞過(guò)新的cube

把路塞住,人物就繞開(kāi)了路

刪除中間的一個(gè)cube:

然后人物就可以在中間通過(guò)了,就像魔獸里面的把樹(shù)滅掉之后,路就能通了

去scene視窗看看,會(huì)發(fā)現(xiàn)現(xiàn)在的網(wǎng)格是這樣的:

移動(dòng)出來(lái)看看,這個(gè)就是我新生成的NavMesh了,其實(shí)這個(gè)東西純粹是為了讓大家看清楚才顯示出來(lái)的,沒(méi)什么實(shí)際意義的。

繼續(xù)添加cube,網(wǎng)格就會(huì)動(dòng)態(tài)變化,變成了這樣:

到現(xiàn)在為止,這套屬于我自己的尋路系統(tǒng)就越來(lái)越有實(shí)用性了?梢詣(dòng)態(tài)生成mesh、可以用于各種平臺(tái)、隨便怎樣保存加載都可以。不過(guò)暫時(shí)還有些bug,還有些功能不太完善,以后有機(jī)會(huì)慢慢的改善吧。

Navmesh入門(mén)教程:

先來(lái)看看怎么在unity打開(kāi)NavMesh功能的窗口吧:

在window下拉列表中可以看到Navgation,點(diǎn)擊:

在原來(lái)Inspector面板的旁邊會(huì)出現(xiàn)Navigation的面板:

這個(gè)Objcet的面板是對(duì)應(yīng)當(dāng)前選擇的物體的,旁邊的Bake面板是對(duì)應(yīng)全局選項(xiàng)的。結(jié)構(gòu)和烘焙或者遮擋剔除是一樣的。在選擇了物體的情況下會(huì)出現(xiàn)上面的內(nèi)容:

上面的All、MeshRenderers、Terranis是對(duì)Hirarchy面板里面顯示的物品選擇的一個(gè)篩選過(guò)濾:

all就是全部顯示

MeshRenderers是只顯示可渲染的網(wǎng)格物體

而Terrains當(dāng)然就是只顯示地形物體了。

下面的是重要的選項(xiàng),第一個(gè)Navigation Static選項(xiàng)是選擇該物體是否用做尋路功能的一部分。只有勾選了這個(gè)選項(xiàng),下面的其他選項(xiàng)才會(huì)可操作。

OffMeshLink Generation選項(xiàng)是選擇該物體是否根據(jù)高度、可跳躍寬帶等全局的選項(xiàng)自動(dòng)生成OffMeshLink,這個(gè)會(huì)在以后的講解中詳細(xì)說(shuō)明,這次就暫時(shí)不討論。

Navigation Layer是對(duì)參與尋路功能的地圖物體的一個(gè)分類,用層來(lái)分類,默認(rèn)有三個(gè)層可以選擇,當(dāng)然也可以自己添加層。

在Edit下拉列表,選擇Project——NavMeshLayers

出現(xiàn)了NavMesh層的管理界面: 

上面三個(gè)Buit-in Layer是系統(tǒng)默認(rèn)的三個(gè)可選擇層,我們可以在下面的User Layer里面輸入自己需要的層的名稱,比如我現(xiàn)在輸入一個(gè)叫做“brigde”的層

這時(shí)候,剛才輸入的“bridge”層,就會(huì)出現(xiàn)在可選擇的列表里面

通過(guò)剛才的幾步,NavMesh常用的幾個(gè)面板我們都已經(jīng)操作過(guò)了,接下來(lái)可以做一個(gè)小例子:

在場(chǎng)景里面,我放了一個(gè)攝像機(jī)(Camera),一個(gè)充當(dāng)?shù)孛娴拿嫫╬lane),一個(gè)角色模型(man)和一個(gè)目標(biāo)點(diǎn)物體(target)

為了便于觀察目標(biāo)點(diǎn)的位置,我在目標(biāo)點(diǎn)物體身上添加了Light組件讓它會(huì)發(fā)光。角色模型(man)身上必須添加NavMesh組件,不然就不能尋路了。為了方便,我使用了官方的大兵模型,里面已經(jīng)帶有了動(dòng)畫(huà)和動(dòng)畫(huà)控制的腳本。不過(guò)這些動(dòng)畫(huà)的表現(xiàn)暫時(shí)是不重要的,你可以選擇放一個(gè)膠囊或者Cube代替人物的模型。

還記得剛開(kāi)始介紹的Navigation面板嗎?選擇地面(plane),在Navigation面板里面里面勾選Navigation Static選項(xiàng),其他的默認(rèn)不改動(dòng)。

然后點(diǎn)擊右下角的Bake面板。這時(shí)候會(huì)有一個(gè)計(jì)算的過(guò)程,曾經(jīng)用過(guò)烘焙或者遮擋剔除的朋友應(yīng)該對(duì)這個(gè)過(guò)程很熟悉了。

不過(guò)和之前兩個(gè)功能一樣,如果你沒(méi)有保存場(chǎng)景l(fā)evel,unity會(huì)提示你先保存,然后再bake。

由于現(xiàn)在場(chǎng)景里面的物體很少,所以Bake的過(guò)程很快就結(jié)束了。

留意看scene視窗,現(xiàn)在地面的顏色已經(jīng)發(fā)生改變了,這是因?yàn)閡nity已經(jīng)幫你生成了尋路用的NavMesh網(wǎng)格,由于現(xiàn)在沒(méi)有遮擋的阻礙物,所以整個(gè)地面都是屬于可以行走的范圍。

寫(xiě)一個(gè)最簡(jiǎn)單的控制腳本吧,以上是C#,由于很簡(jiǎn)單,估計(jì)用Js的朋友也能對(duì)應(yīng)的寫(xiě)出來(lái)。

簡(jiǎn)單的解釋一下,這個(gè)腳本是直接拖放到角色(man)身上的,并把場(chǎng)景中的目標(biāo)物體(target)拖放指定到該腳本的target變量上面進(jìn)行了賦值。在腳本一開(kāi)始的時(shí)候,我 先獲取了man身上的NavMeshAgent腳本組件,然后在Update的過(guò)程中,man不斷的進(jìn)行對(duì)target的位移的一個(gè)尋路并移動(dòng)到目標(biāo)位置的操作。

在進(jìn)行完以上的操作后,你應(yīng)該已經(jīng)可以點(diǎn)擊unity的播放按鈕,然后移動(dòng)目標(biāo)物體(target),這時(shí)候角色模型已經(jīng)可以追著目標(biāo)點(diǎn)跑了。

這里我還做了一個(gè)簡(jiǎn)單的鼠標(biāo)點(diǎn)擊plane設(shè)定目標(biāo)點(diǎn)的功能,由于這個(gè)功能不在這次的討論范圍內(nèi),所以有興趣的朋友可以自己去百度一下具體的方法。

進(jìn)行到這一步,人物已經(jīng)跑起來(lái)了,但由于沒(méi)有遮擋的障礙物,所以人物只是會(huì)直線的行走,看不出尋路的感覺(jué)。接下來(lái)我們就做點(diǎn)更復(fù)雜的:

在場(chǎng)景里面添加一個(gè)Cube做為障礙物,具體的形狀和位置請(qǐng)根據(jù)自己喜歡來(lái)調(diào)節(jié),阿趙我是把它做成了一個(gè)長(zhǎng)方形,并擺在了角色面前。

和剛才對(duì)地面的操作差不多,選擇遮擋物Cube,在Navigation面板里面勾選Navigation Static選項(xiàng),這次的Navigation Layer要選擇Not Walkable。顧名思義,這是不能行走的意思,代表了這個(gè)Cube是不能通過(guò)的。

選擇完成后,我們?cè)俅吸c(diǎn)擊Bake,又是一個(gè)小等待的過(guò)程。

Bake完成后,我們回到scene視窗。

觀察scene視窗,會(huì)發(fā)現(xiàn)剛才整個(gè)地面都是NavMesh的情況已經(jīng)改變了,在障礙物的周?chē),NavMesh留出了一個(gè)缺口,這代表了角色已經(jīng)不能從障礙物身上通過(guò)了。

再次點(diǎn)擊unity的播放按鈕

現(xiàn)在可以看到,人物已經(jīng)可以繞著障礙物走了,我們的目的已經(jīng)順利達(dá)到了。

這次的例子就到此結(jié)束了。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)