1. 程式人生 > >Unity3d NavMeshAgent自動尋路元件

Unity3d NavMeshAgent自動尋路元件

我們常見的有三種尋路方式

1.路點尋路

2.單元格尋路

3.網格尋路

簡單介紹一下

1.路點尋路 如下圖,物體從 point位置出發依次經過(point1 、point2、point3、point4、point5)進行移動

程式碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WayPointPath : MonoBehaviour {
    //所有路點的父物體
    private Transform point_parent;
    private int k=0;
	// Use this for initialization
	void Start () {
        //獲取路點的父物體
        point_parent = GameObject.FindWithTag("Way").transform;

	}
	
	// Update is called once per frame
	void Update () {
        PointToPoint();
	}
    //物體按照路點移動
    void PointToPoint()
    {
        //判斷物體到下一個路點的距離
        if (Vector3.Distance(transform.position, point_parent.GetChild(k).position) > 1f)
        {
            //用Vector3.Lerp移動
            transform.position = Vector3.Lerp(transform.position, point_parent.GetChild(k).position, 0.1f);
        }
        else
        {
            k=(k+1)%point_parent.childCount;
        }
    }
}

2.單元格尋路, A*演算法外掛 與貪婪演算法不一樣,貪婪演算法適合動態規劃,尋找區域性最優解,不保證最優解。A*是靜態網格中求解最短路最有效的方法。也是耗時的演算法,不宜尋路頻繁的場合。一般來說適合需求精確的場合。 與啟發式的搜尋一樣,能夠根據改變網格密度、網格耗散來進行調整精確度。 使用較好的地方: a.策略遊戲的策略搜尋 b.方塊格子游戲中的格子尋路 3.網格尋路(NavMeshAgent)

實現尋路步驟:

  1. 將場景中不動的物體勾選static,

到window中調出 視窗,點選Bake烘焙,形成尋路(藍色)網格。

  1. 需要自動尋路的物體,選中要尋路的物體 在Component新增NavMeshAgent自動尋路元件。

       

  1. 新增指令碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//尋路要引入的名稱空間
using UnityEngine.AI;

public class NewBehaviourScript : MonoBehaviour {
    //通過尋路要去找到的  目標物體
    public Transform target;
    //尋路元件
    private NavMeshAgent agent;
	// Use this for initialization
	void Start () {
        //獲取尋路物體上的NavMeshAgent元件
        agent = GetComponent<NavMeshAgent>();
        //通過SetDestination方法(網格路徑計算)實現自動尋路
        agent.SetDestination(target.position);
	}
}

  • NavMeshAgent屬性

Radius 尋路的碰撞半徑

Height尋路的碰撞高度

BaseOffset 尋路碰撞的位置

Speed 尋路物體的速度

Acceleration 轉彎時的加速度

AngularSpeed 轉彎時物體的角速度

StoppingDistance 停止的距離

AvoidancePriority 躲避係數

  • 尋路路徑烘焙屬性

Radius 是指尋路區域與障礙物之間半徑

Height 是指尋路區域與地面之間的高度

MaxSlope 是指尋路區域烘焙的最大坡度

StepHeight 是指臺階高度

  • 尋路系統區域遮罩:
  1.   分別新增自定義區域,如Red、Blue區域.
  2. 選擇場景中的靜態路面      指定到相應尋路區域
  3. Bake尋路路面。
  4. 找到需要尋路的物體,設定可在尋路路面行走的區域。

(PS:Cost:尋路區域消耗度,數值越大,從此尋路區域消耗越大。

尋路物體在區域消耗數值一樣的情況下,會選擇最優(最近)路面尋路,但如果尋路區域的消耗數值不同,會根據消耗的數值,越小越最優進行尋路。)

  • 通過程式碼實現勾選不同的尋路區域:

GetComponent<NavMeshAgent>().areaMask =9;

尋路區域每一區域都是2的冪

 

9則為Walkable區域(1)+red區域(8) = 9

Everything所有區域-1 Nothing任何區域都不能尋路 0