標籤:div 自動 bsp unit 下拉式清單 動態控制 長方形 gif 下拉
http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/
說明:從今天開始,我阿趙打算寫一些簡單的教程,方便自己日後回顧,或者方便剛入門的朋友學習。水平有限請勿見怪。不過請尊重碼字錄屏的勞動,如需轉載請先告訴我。謝謝!
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的播放按鈕現在可以看到,人物已經可以繞著障礙物走了,我們的目的已經順利達到了。 這次的例子就到此結束了。 在第二節裡,我會詳細的講解高低落差、爬梯子以及跳躍等較為複雜一點的功能。然後會在第三節裡面講解分條件的尋路(不同人走不同的路),以及動態控制道路(如弔橋)等的功能。 第一次寫教程,可能有些不太人性化的地方,請各位諒解。 再次提醒,請體諒作者辛苦,如需轉載,請通知我,我是阿趙,謝謝!
【轉】unity內建尋路Navmesh入門教程(一)