當前位置:編程學習大全網 - 源碼下載 - 如何使用Unity做遊戲中的尋路導航

如何使用Unity做遊戲中的尋路導航

現在的大部分mmo遊戲都有了自動尋路功能。點擊場景上的壹個位置,角色就會自動尋路過去。中間可能會有很多的障礙物,角色會自動繞過障礙物,最終達到終點。使用Unity來開發手遊,自動尋路可以有很多種實現方式。

最近,壹名海外開發者在博客中分享了自己用Unity引擎重做此前研發的Flash遊戲尋路導航的心得,希望可以給大家帶來幫助:

大家好,最近我壹直都在忙於把2006年的壹款Flash遊戲用Unity引擎重做出來,盡管我們在《Arrival in Hell》這個項目已經工作了壹年多,但這裏我希望從頭開始來寫開發者博客,因為這樣才能讓讀者們有比較完整的印象。

如果妳們不太熟悉這款遊戲的話,我這裏做幾句話的介紹,我們在對2006年我和朋友Eduardo Mojica以及Richard Rout三人研發的壹款Flash遊戲進行重做,這是壹款點擊式操作的冒險遊戲,我們將用Unity引擎進行重做。我做編程和研發遊戲已經有十年左右的經驗,但這是我使用Unity引擎做的首款遊戲。

在其他事情之前,我首先想要說的就是玩家角色的移動,由於這款遊戲現在是真正的3D,因此玩家角色需要在3D空間裏尋路。幸運的是,Unity引擎已經有了壹些不錯的內置尋路功能,妳只要打開窗口-導航(Navigation),選擇妳想要使用的物體並且放到路徑中,然後把他們標記為‘導航靜態(Navigation static)’這就會告訴Unity這些物體是靜態的(非移動),在尋路的時候應該被考慮進去。

把物體設置為‘導航靜態’

這裏我想要說壹說這個功能有多麽強大。過去,我和大多數的遊戲開發者壹樣,都必須打造自己的尋路系統,我之前就做過壹個A*tile和基於節點的尋路系統,在兩種情況下,特別是基於節點系統的尋路所產生的walls讓人非常頭痛。在基於節點的尋路系統中,妳必須手動地把AI使用的點在兩者之間進行導航。Unity不僅做導航功能,還使用了導航網格(Navigation meshes),這比手動放置節點更有效率而且更流暢。更重要的是,妳還可以壹鍵重新計算整個導航網格,徹底擺脫了手動修改導航節點的做法。

我用基於節點系統做的失敗的尋路系統之壹

在把靜態物體加入了導航網格之後,妳可以選擇壹系列的設定然後點擊bake按鈕,比如在考慮加入壹堵墻之前確定坡有多陡以及臺階應該多高。這樣妳就可以獲得可以預覽的視圖。值得註意的壹件事是,不要僅僅因為物體存在在場景中就意味著它是導航網格的壹部分。比如說在這款遊戲中,我不在乎玩家們是否會踩到瓦礫,所以我並沒有把任何瓦礫標識為導航靜態,這加快了當行網格的生成速度。

《Arrival in Hell》中其實是有數值的

在導航網格生成之後,我簡單地給玩家模型增加了壹個NavMeshAgent組件,這款遊戲現在就可以進行尋路了,唯壹剩下的就是增加鼠標輸入控制NavMeshAgent的目的地。

用NavMesh做的bake

NavMeshAgent設定

為了告訴NavMeshAgent導航我做了以下指令:

1.註意聽取鼠標輸入

2.把鼠標放進屏幕空間

3.把屏幕空間轉變成來自攝像頭的壹束光

4.在光達到地面的時候把它移除

5.把NavMeshAgent的目的地設定到地板的對應位置。

C#代碼是這樣的:

可視化視圖下的目的地與路徑

這就解決了我這款遊戲的大多數導航需求,唯壹的例外就是導航網格由於遊戲內的壹些活動而發生改變的時候。比如第壹個房間的們最開始是關閉的,後來當它打開的時候,當行網格需要更新反映此次變化,允許玩家從新開的們中走過去。我並沒有在遊戲運行的時候rebake完整的靜態導航網格,而是使用了NavMeshObstacle組件,該組件可以讓妳把尋路過程中的動態物體加進去,如果物體移動,Unity的尋路算法就會根據實際情況而更新。

導航路徑會根據NavMeshObstacle的變化而自動發生改變

可視化視圖

所以,遊戲尋路導航就這麽做好了,這就是《Arrival in Hell》遊戲中的導航工作原理,這壹些只需要Unity內自帶的導航功能就可以完成了。

  • 上一篇:夢見突然變天下暴雪
  • 下一篇:病毒是怎麽寫出來的?
  • copyright 2024編程學習大全網