網易博客轉載 博主:啊趙
說明:從今天開始,我阿趙打算寫一些簡單的教程,方便自己日後回顧,或者方便剛入門的朋友學習。水平有限請勿見怪。不過請尊重碼字截圖錄屏的勞動,如需轉載請先告訴我。謝謝!
unity自從3.5版本之後,增加了NavMesh尋路的功能。在此之前,unity用戶只能通過第三方插件(如Astar尋路插件)等做尋路功能。阿趙我也使用過A*尋路插件,A*的原理並不復雜,有興趣的朋友可以自己百度一下。不過由於不是自帶的功能,所以在設定網格和烘焙的過程難免會出現很多不便。NavMesh作為unity自帶的功能,用法和之前的LightMapping烘焙或者遮擋剔除Occlusion Culling有很多相似之處。
這個功能有很多有趣的地方,而且用起來也很方便,我打算分開幾篇日志來逐一介紹。這次的目的只是簡單的認識一下NavMesh的基本用法,所以暫時不詳細的翻譯組件每一個參數和功能的意思。
先來看看怎麼在unity打開NavMesh功能的窗口吧:
在window下拉列表中可以看到Navgation,點擊:
在原來Inspector面板的旁邊會出現Navigation的面板: 這個Objcet的面板是對應當前選擇的物體的,旁邊的Bake面板是對應全局選項的。結構和烘焙或者遮擋剔除是一樣的。在選擇了物體的情況下會出現上面的內容: 上面的All、MeshRenderers、Terranis是對Hirarchy面板裡面顯示的物品選擇的一個篩選過濾: all就是全部顯示 MeshRenderers是只顯示可渲染的網格物體 而Terrains當然就是只顯示地形物體了。 下面的是重要的選項,第一個Navigation Static選項是選擇該物體是否用做尋路功能的一部分。只有勾選了這個選項,下面的其他選項才會可操作。 OffMeshLink Generation選項是選擇該物體是否根據高度、可跳躍寬帶等全局的選項自動生成OffMeshLink,這個會在以後的講解中詳細說明,這次就暫時不討論。 Navigation Layer是對參與尋路功能的地圖物體的一個分類,用層來分類,默認有三個層可以選擇,當然也可以自己添加層。 舊版本:在Edit下拉列表,選擇Project——NavMeshLayers 注意:在4.幾的新版本後,這個尋路層管理打開的位置發生了變化,變成了在Navigation 面板裡面了: 出現了NavMesh層的管理界面: 上面三個Buit-in Layer是系統默認的三個可選擇層,我們可以在下面的User Layer裡面輸入自己需要的層的名稱,比如我現在輸入一個叫做“brigde”的層 這時候,剛才輸入的“bridge”層,就會出現在可選擇的列表裡面 通過剛才的幾步,NavMesh常用的幾個面板我們都已經操作過了,接下來可以做一個小例子: 在場景裡面,我放了一個攝像機(Camera),一個充當地面的面片(plane),一個角色模型(man)和一個目標點物體(target) 為了便於觀察目標點的位置,我在目標點物體身上添加了Light組件讓它會發光。角色模型(man)身上必須添加NavMesh組件,不然就不能尋路了。為了方便,我使用了官方的大兵模型,裡面已經帶有了動畫和動畫控制的腳本。不過這些動畫的表現暫時是不重要的,你可以選擇放一個膠囊或者Cube代替人物的模型。 還記得剛開始介紹的Navigation面板嗎?選擇地面(plane),在Navigation面板裡面裡面勾選Navigation Static選項,其他的默認不改動。 然後點擊右下角的Bake面板。這時候會有一個計算的過程,曾經用過烘焙或者遮擋剔除的朋友應該對這個過程很熟悉了。 不過和之前兩個功能一樣,如果你沒有保存場景level,unity會提示你先保存,然後再bake。 由於現在場景裡面的物體很少,所以Bake的過程很快就結束了。 留意看scene視窗,現在地面的顏色已經發生改變了,這是因為unity已經幫你生成了尋路用的NavMesh網格,由於現在沒有遮擋的阻礙物,所以整個地面都是屬於可以行走的范圍。 寫一個最簡單的控制腳本吧,以上是C#,由於很簡單,估計用Js的朋友也能對應的寫出來。 簡單的解釋一下,這個腳本是直接拖放到角色(man)身上的,並把場景中的目標物體(target)拖放指定到該腳本的target變量上面進行了賦值。在腳本一開始的時候,我 先獲取了man身上的NavMeshAgent腳本組件,然後在Update的過程中,man不斷的進行對target的位移的一個尋路並移動到目標位置的操作。 在進行完以上的操作後,你應該已經可以點擊unity的播放按鈕,然後移動目標物體(target),這時候角色模型已經可以追著目標點跑了。 這裡我還做了一個簡單的鼠標點擊plane設定目標點的功能,由於這個功能不在這次的討論范圍內,所以有興趣的朋友可以自己去百度一下具體的方法。 進行到這一步,人物已經跑起來了,但由於沒有遮擋的障礙物,所以人物只是會直線的行走,看不出尋路的感覺。接下來我們就做點更復雜的: 在場景裡面添加一個Cube做為障礙物,具體的形狀和位置請根據自己喜歡來調節,阿趙我是把它做成了一個長方形,並擺在了角色面前。 和剛才對地面的操作差不多,選擇遮擋物Cube,在Navigation面板裡面勾選Navigation Static選項,這次的Navigation Layer要選擇Not Walkable。顧名思義,這是不能行走的意思,代表了這個Cube是不能通過的。 選擇完成後,我們再次點擊Bake,又是一個小等待的過程。 Bake完成後,我們回到scene視窗。 觀察scene視窗,會發現剛才整個地面都是NavMesh的情況已經改變了,在障礙物的周圍,NavMesh留出了一個缺口,這代表了角色已經不能從障礙物身上通過了。 再次點擊unity的播放按鈕 現在可以看到,人物已經可以繞著障礙物走了,我們的目的已經順利達到了。 這次的例子就到此結束了。 在第二節裡,我會詳細的講解高低落差、爬梯子以及跳躍等較為復雜一點的功能。然後會在第三節裡面講解分條件的尋路(不同人走不同的路),以及動態控制道路(如吊橋)等的功能。