1. 程式人生 > >Unity中自動尋路的幾種方法(一)

Unity中自動尋路的幾種方法(一)

在遊戲製作中,我們經常會用到角色自動尋路這個功能,點選小地圖或者場景中的某一處時,角色會自動走向目的地,並且自動避開期間的障礙物。不單單在遊戲的製作中用得到這個功能,在虛擬現實的專案中同樣有時候會需要這樣的功能。

在Unity中,有多種方法能夠實現尋路的功能,我試用的有以下這些方法建議大家可以嘗試。首先是在一些遊戲製作中用得最多的A星尋路,其次是外掛iTween,他提供了很多方法,用起來也十分的簡單,Unity也有自帶的尋路元件Navigation,還有就是一些程式邏輯來編寫,類似於AI,或者結合Lookat方法自主編寫隨機或者預定好的行走路線。下面我會詳細地介紹一下以上途徑的具體實現方法:

首先是A星尋路。這是在一些三維遊戲製作以及VR中用得比較多的一個尋路外掛。其原理是A星尋路演算法,如果想對A星演算法做深入的瞭解可以谷歌一下,網路上有一些大神對該演算法做了詳細得剖析,下面我介紹一下這個外掛怎麼在Unity實現自動尋路的功能。

首先先從網上下載到A星尋路外掛,百度下到處是,匯入到Unity中,外掛中已有了很多個示例。講解了在多種情況下,遊戲主題如何拐過障礙物,到達目的地的。我主要介紹一下這一實現過程。在新場景中建一個Plane作為地面,新建一個膠囊體作為移動物件,建一個球體作為移動的目的地,再建立一些障礙物。如下圖所示:


在移動物件上掛上AIFollow.cs指令碼,再添加了這個指令碼之後,它會自動幫你新增上Character Controller和Seeker指令碼,同時,在該物件上再新增上Funnel Modifier.cs,Simple Smooth Modifier.cs,Navmesh Controller.cs這三個指令碼,如下圖所示:


其主要指令碼就是AIFollow.cs這個指令碼。其Target就是你的目的地,下面是一些關於他更新 途中結點的頻率,移動速度,旋轉速度等等變數,可以控制是否畫出路徑等等。這些引數可以自行調節,上圖僅供參考。

接下來在場景中建一個空物件,掛上Astar Path.cs指令碼,選擇RecastGraph選項,如下圖所示:


下面就是關於這些變數的設定,Cell Size變數跟你障礙物之間間隙有關,當你的障礙物之間間隙比較小的時候,建議這個值設小一點,下面是一些可走區域的高度,攀爬高度,以及物件半徑等引數,下面可以設定區域的坡度,Max Edge Length這個引數跟你線的複雜度有關,最小可設定到0.05,當然資料特別小的時候,線圈佈局很繁忙,很耗資源,一般設定幾百就好了,效果可以自行調節除錯。設定完成之後可以點選一下Snap bounds to scene,來規定界限。也可以自己微調其區域大小和位置。

在Settings中設定一下以上屬性,如上圖所示。還有一些引數可以參考外掛中的一些demo場景。

一切都設定好了之後,執行場景就可以看到下面的效果:


其綠色部分為求即將行走的路線,黃色的圈是球會在途中去尋找結點,也就是讀取地上生成的線條 來確定走的路線。