多邊形尋路實現

【轉載】多邊形尋路實現  

Unity3d本身自帶有了NavMesh尋路功能。但用過這個功能的人,都會有各種的抱怨。比如,必須使用編輯器去烘焙、動態加載不方便、不能在服務器使用、不能隨意的編輯,等等。
這裏我自己做了一個多邊形尋路的功能。這個功能純粹是通過預存的數據生成一個模擬的多邊形網格,然後通過座標來計算的。所以這套東西是不限平臺使用的,包括了在as3、在java或者c++的服務器、2d或者3d遊戲都可以使用。不過針對不同的語言環境,肯定是需要做一定的修改的了。

爲了測試我這套東西,我做了以下這個可行走的範圍:點擊鼠標,會在可行走範圍內生成一條路徑,然後代表着人物的cube就會根據路線來行走。
多邊形尋路實現 - 阿趙 - 有爪的小羔羊阿趙
 
在尋路過程中,如果能直着走,那麼我計算出來的路徑就絕對不會是彎的。
多邊形尋路實現 - 阿趙 - 有爪的小羔羊阿趙
 
如果必須是要拐彎,我計算的路徑就會是拐一個最小的彎來走到目的地。
多邊形尋路實現 - 阿趙 - 有爪的小羔羊阿趙
 
這是在scene視圖的效果。其實這些組成多邊形的點和多邊形本身,只是我自己爲了方便看,而特意用動態網格生成出來的。對計算是沒有任何的意義的。
多邊形尋路實現 - 阿趙 - 有爪的小羔羊阿趙

簡單的說一下思路:
1、把可行走的區域分成若干個區域,每個區域都是凸多邊形;
2、通過A*算法,先找出人物和目標點之間應該走的大區域(也就是圖中的紅色區域了);
3、得到大區域之後,使用向量叉乘,計算出人物應該行走的具體路線。

這個方法對比起Unity3d自帶的NavMesh尋路,有以下優點:
1、自由度高,由於全部是自己寫的,包括算法。所以可以根據使用情況自由擴展。
2、可以使用在任意的平臺

對比原始的A*尋路,這種尋路會更快。因爲一開始只是定一個大區域,網格的信息相對於A*整張地圖的二維表,會少很多。
對比起路徑點尋路,這種尋路出來的效果會更好看一點,因爲人物很容易就能找到直線路徑,而不像路徑點一樣,很容易讓角色走Z型的路徑。

缺點是,尋路的算法不是難點,難的地方是要動態的生成這些網格信息,如果要做成比較像樣的地圖編輯工具,會比較有難度。
折中的方法,就是像我現在這樣,自己通過點來定尋路多邊形了,不過這樣做需要一定的熟悉,不然在製作過程中會很麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章