【Gamelook專稿,轉載請註明出處】
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內自帶的導航功能就可以完成瞭。