天天看點

NavMesh動态建立尋路網格技術在多障礙物的情況下

demo視訊

上次發上來的NavMesh動态生成技術,有網友問我效率的問題,上次的示範隻是簡單的測試實作的情況,然後簡單的測試了在少數障礙物的情況下的時間是0毫秒。這次修改了一下,模型的範圍不再是矩形,而是有了一個邊角範圍。這樣的計算比上次的稍微複雜了一點。然後我這次放比較多的障礙物,來測試效率的問題。

看看上面的視訊可以知道。在物體不多的情況下,基本上是感覺不出來生成網格的時間的。不過物體到達了一定數量之後,還是會有一定的等待時間的,比如上面的例子再最多障礙物的情況下,大概是半秒左右。

這個網格生成的過程,其實是計算了很多東西的,物體多了之後肯定是會占用一定的時間的。我們可以這樣看待它的使用價值:

1、我們不需要漫長的bake等待,隻需要短短的幾毫秒到幾秒鐘時間,就能生成好需要的網格。當然了,我這個計算的東西會比官方自帶的NavMesh要少很多,不過我覺得針對一般的手機遊戲或者網頁遊戲,應該是夠用的。那麼,我們不需要bake就能用,而這個短短的幾毫米到幾秒鐘,我們可以放在場景初始化的時候做,玩家基本不會有感覺。

2、可以動态障礙物。在實際的應用中,動态障礙物不會經常的出現,而隻是會出現在某些情況。比如一條路突然被石頭砸中擋住了,或者某些樹木被鏟平了變成可以走了,再或者複雜點的,下起流星雨,某個區域漸漸越來越多障礙物了。這些情況,我們可以提早的知道出現的區域,然後單獨的生成一個網格作為動态改變網格的區域。在這樣的情況下,動态障礙物生成網格的時間久不會很多了。

3、尋路的資訊可以按照自己的需要才生成,或者傳輸。我們可以在各種平台動态下載下傳我們需要的尋路資訊,或者直接到用的時候才生成。這樣,我們可以在伺服器用、可以在網頁遊戲用,可以在手機平台用。

官方提供的NavMesh比我這個自己寫的功能強大很多,不過由于需要烘焙,使用的限制會比較大一點。最新的4.3版本的Unity3D,看官方的更新文檔,好像已經有了動态障礙物的功能,但我試了一下,沒有發現。如果這個功能可以由官方提供,那肯定是更好了。

然後這個功能我也很順便的移植到了flash上面去,同樣的順利運作了。不過flash的效率比unity3d真的差很多很多,同樣的代碼,同樣的算法,但在flash生成動态網格的時候,隻有少數幾個障礙物的情況也會明顯的感覺到生成的時間。而unity在這方面就好很多了。

不過做flash是有很多郁悶的事情的,很多很基礎的東西,都是要自己寫,是以用unity3d的人是很幸福的,什麼工具和常用功能都已經提供了,直接用就可以了。