unity 自動尋路
阿新 • • 發佈:2018-12-18
在專案開發中有時候,會用到unity自帶的自動尋路系統NavMesh,今天就說下他的簡單用法,NavMesh就是將遊戲場景中複雜的結構組織關係簡化為帶有一定資訊的網格,進而在這些網格的基礎上通過一系列的計算來實現自動尋路,在導航中,只需要給導航物體掛載到導航物體上,導航物體便會自行根據目標點來尋找符合條件的路線,並沿著該路線行進到目標點。
一、實現物體通過自動尋路移動到指定地點
1.首先就是編輯一個簡易的場景:
2.選中場景中的物件物體,將Static設定為Navigation Static複選框,unity就會通過選中的物件生成導航網格:
3.選擇選單欄中的Window--->Navigation命令,彈出Navgation檢視。然後選擇Navgation檢視中的Bake按鈕生成導航網格
4.就會生成相應的bake資訊,其中藍色區域就是可以進行移動的區域:
5.建立一個可移動的物體,這裡就用一個膠囊體代替,為其新增NavMesh Agent元件,下面講解一下這個元件的具體資訊:
Base offset 與地面偏移高度 speed 移動速度 Angular Speed 轉角速度 ,轉身速度 角速度: 最高轉速(度/秒)。 Acceleration 加速度,啟動時的 最大加速度。 Stopping Distance 停止距離 ,,制動距離:制動距離。到目的地的距離小於這個值,代理減速。 Auto Traverse OffMesh Link 自動遍歷OffMesh連結:自動移動並關閉OffMeshLinks Auto Repath 自動重新尋路:如果現有的部分已失效,獲得新的路徑。 Height 高度:代理的高度(用於除錯圖形)。 Base offset 基本偏移:碰撞幾何體相對於實際幾何體垂直的偏移。 Obstacle Avoidance Type 障礙躲避型別 :躲避的質量水平。 NavMesh Walkable 導航網格行走:指定代理可以遍歷的導航網格層型別。這個引數很有用,在接下來的例項中可以用到。
6.為膠囊體新增移動指令碼,通過滑鼠點選移動到指定地點,程式碼如下:
public Camera camera; //相機 private NavMeshAgent navMeshAgent; // Use this for initialization void Start() { navMeshAgent = GetComponent<NavMeshAgent>(); } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { if (navMeshAgent != null) { //獲取從主相機發出的一條射線 Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit mHit; if (Physics.Raycast(mRay, out mHit)) { //當碰撞到Terrain使獲取到當時的位置 if (mHit.collider.gameObject.tag == "Player") { navMeshAgent.destination = mHit.point; } } } } }
具體效果:
備註:如果想實現可以直接跳躍到指定的目標位置處,可以設定Drop和Jump Distance,然後重新Bake就可以了:
二、實現不同物體,沿自己的專有道路移動到指定位置
1.搭建自己想要的場景資訊:
2.像上面的方式一樣,對所有路徑進行bake處理,但是唯一不同的需要設定不同的Layer,這裡我們設定三個不同的layer
3.先為不同的路徑設定對應的layer
4.為不同的移動的物體設定對應的layer:
5.然後新增移動程式碼:
public GameObject TargetGo;
public GameObject[] Solider;
// Use this for initialization
void Start()
{
for (int i = 0; i < Solider.Length; i++)
{
Solider[i].GetComponent<NavMeshAgent>().destination = TargetGo.transform.position;
}
}
6.移動效果
想了解更多相關資訊,可以關注下方公眾號或者QQ群:879354767