如何在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開發方面的博客?