插件地址:h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding (github.com)
我對Unity官方是深惡痛覺,一個2D尋路至今都沒想解決,這破引擎早點倒閉算了.
這插件是githun的開源項目,我本身是有寫jps尋路的,但是無法解決多個單位互相阻擋的問題(可以解決但是有性能問題).
1.導入插件
?
2.建立"NavMesh"空物體,添加Navigation Surface,Navigation CollectSources2d組件,點擊"Rotate Surface to XY",切換到面向攝像機
?
3.在TileMap的碰撞層加入NavMeshModifier組件,勾選OverrideArea,選擇NotWalkable.這代表是不可行走.
4.在TileMap的地面層,加入NavMeshModifier組件,勾選OverrideArea,選擇Walkable.這代表是可行走.(和上面差別就是選擇不同)
?
5.在NavMesh物體,選擇Navigation Surface,根據需求調整Layers層級,UseGeometry,有根據 圖片渲染,和根據Colliders渲染,根據自己需求調整,我的TileMap碰撞有修改,所有選擇物理碰撞生成,點擊"Bake"烘培行走路徑.
烘培以后地圖是這個樣子
?
?
?6.新建一個單位,添加Nav Mesh Agent組件.然后新建一個腳本掛載上.
public NavMeshAgent navMeshAgent;private void Start(){navMeshAgent.updateUpAxis = false;navMeshAgent.updateRotation = false;navMeshAgent.SetDestination(new Vector3(5, 5));}
以上腳本是鎖住旋轉和Z軸,然后給定目標點.
如果需要持續追蹤目標點,可以使用目標單位的Tansfrom的坐標位置傳入
其他問題:
運行時烘焙
通常游戲具有程序化的世界構建,需要在運行時烘焙 NavMesh。要實現此目的,您需要在組件中調用單個方法,以便在運行時以 Unity 異步方式烘焙 NavMesh。可以在方法上調用此方法。BuildNavMeshAsync
NavigationSurface
Start()
public NavMeshSurface Surface2D;void Start(){Surface2D.BuildNavMeshAsync();}
已知問題
代理在 Y 軸上移動或設置代理時卡住。如果 x=0_,Velocity 不會做任何事情 - 這似乎是 NavMeshAgent 組件中的一個錯誤。目前沒有可用的修復程序,但有解決方法。解決方法的想法很簡單,調整 X 上的代理移動,使其永遠不會直線上升。 導航網格可以有一個小的傾斜89.98,以使代理工作。 如果由于某種原因它不能解決問題,則需要添加漂移。
satic float agentDrift = 0.0001f; // minimalvoid SetDestination(GameObject target){ if(Mathf.abs(transform.position.x - target.transform.position.x) < agentDrift)var driftPos = target.transform.position + new Vector3(agentDrift, 0f, 0f);agent.SetDestination(driftPos);}
這是官方給出來的解決辦法..