如何在Unity中預覽尋路的結果?

如圖所示,假如玩家本回合能移動30米,如何得到這個可行動的範圍,以及範圍內每一點的路徑?


看到問題描述立即聯想到這個遊戲: Divinity Original Sin

這裡面移動路徑是都是一個個的點表示出來的, 不過最大的移動範圍沒有明確標記出來, 因為你滑鼠位置本來就顯示了路徑, 能移動哪裡, 能移動多遠, 其實已經很明顯了

回到Unity, 要尋路還是要構建一下NavMesh:

假設紅球是我們的玩家, 暗紅色的圓柱是障礙物, 藍點組成的圓代表我們的最大移動範圍(沒考慮障礙物), 紅點是滑鼠的位置, 綠點組成的線代表我們的移動路徑:

通過NavMeshAgent就能計算出路徑點的集合, 然後我們在這些折線上算出離散的綠點用於預覽路徑的繪製, 計算這些綠點的同時, 比較最大移動距離也就知道在哪個綠點結束了, 如下圖所示, 玩家是走不到滑鼠位置的(紅點):

其實這樣我個人覺得已經能夠滿足一般遊戲的需求了, 如果非要顯示出實際的移動範圍, 可以使用NavMesh.CalculatePath在Coroutine中計算玩家到每個藍點的路徑長度, 如果大於玩家的移動範圍, 就延半徑方向向圓心(玩家位置)收縮一個移動單位, 繼續求解路徑長度, 直到滿足玩家的移動範圍為止:


好吧,這個問題是我提的,正如 @逍遙劍客 說的那樣,現在做的東西也是對神界3:原罪的一次拙劣模仿和嘗試。不過這個效果最初我沒有想到神界3,而是全面戰爭戰略地圖下軍隊移動時候的效果。

提問以來我就忙著加班,所以還沒來得及認真把題目做一次。但是平時上班的時候,我閑暇的時候有了三個實現的想法。

第一個想法就是劍客的方案,先以最大移動半徑畫個圓,然後順時針遍歷各點向內收縮到可到達為止。這個想法最簡單,但是如果碰到比較奇怪的地形可能會有問題。

第二個想法最暴躁,就是簡單密集的遍歷地圖上各點的可否到達,然後再遍歷其中距離最大的點。這個想法效率低下,不過考慮到一個回合當中,只需要遍歷一次,為此拿出一到兩秒的響應時間也無所謂,所以最開始我是想做這個的。

而且再次考慮之後,我覺得,在製作地圖的時候,就可以預先排除一些不可到達的點,實際演算法的效率沒有想像中的不堪。

第三個想法等下說,也正是我要寫的,我訂了個螺螄粉,1小時後到,我看能不能花一小時寫完第三個想法的雛形。

=============================================================

媽的螺螄粉來的意外的早。

寫了一下,發現第三個想法有點坑,也就是找到一個最遠點,然後每個點逆時針每10度做一次搜索,找到下一個點的位置,慢慢逆時針畫出整個圖形。

問題在哪呢,假如下圖所示,就有點問題

A點和B點,在判斷方向上有問題。

其次,在每10度搜索的時候,如果實際的範圍在A和A`之間,那麼這個誤差可能在後面會被放的越來越大。

總之,我先好好想想,怎麼寫。

因為我的項目之前是做的六邊形地形的,現在由於機制原因,很難實現一些錐形、射線、橫掃一類機制,所以決定重寫一遍,這個東西錦上添花。要是做不出來就不摳了。


廣度優先遍歷,都這麼做的。

不要用啥A*之類的莫名其妙的東西。

MESH的方式其實也同理,選擇網格時採用遍歷並取極值延伸,然後在最後一個折點當原點畫弧,多個範圍重疊取外沿。但這顯然得用三方尋路來改。

不過我基本沒見過MESH尋路還顯示可行走範圍的,有這個的不都是走格子的么?

樓上那個是能做,但是顯然效率很低。


借樓問個問題,calculatePath 計算出來的路徑和實際走的路徑不一樣,為什麼呢,(用了兩層尋路網格,實際走的是直線,calculatePath計算出來的在兩個網格交接的地方會優先選擇走到一層的一個頂點,拐個彎走)


建立平面空間四叉樹,模擬出格子(這個有很多現成插件,推薦自己寫)。

建立類似英雄無敵尋路的尋路控制器,廣度優先遍歷計算路徑(不建議使用unity的尋路)。

以格子為單位計算行動長度和當前回合移動長度。


推薦閱讀:

如何在Unity中對程序進行 Android 真機斷點調試?
unity 3d 中如何實現以物體的表面作為播放視頻的位置,比如在牆面播放視頻?
學習 Unity3D 開發,有哪些資源(論壇或網站)?
有哪些推薦的Unity3D開發方面的博客?

TAG:遊戲開發 | 編程 | Unity遊戲引擎 | C# |