(點擊上方↑↑↑↑↑↑「GameLook」,訂閱微信)
隨著手遊市場的興起和對獨立開發者的支持,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#代碼是這樣的:
點擊設置NavMeshAgent的目的地
可視化視圖下的目的地與路徑
這就解決了我這款遊戲的大多數導航需求,唯一的例外就是導航網格由於遊戲內的一些活動而發生改變的時候。比如第一個房間的們最開始是關閉的,後來當它打開的時候,當行網格需要更新反映此次變化,允許玩家從新開的們中走過去。我並沒有在遊戲運行的時候rebake完整的靜態導航網格,而是使用了NavMeshObstacle組件,該組件可以讓你把尋路過程中的動態物體加進去,如果物體移動,Unity的尋路算法就會根據實際情況而更新。
導航路徑會根據NavMeshObstacle的變化而自動發生改變
可視化視圖
所以,遊戲尋路導航就這麼做好了,這就是《Arrival in Hell》遊戲中的導航工作原理,這一些只需要Unity內自帶的導航功能就可以完成了。