Unity3d NavMeshAgent自動尋路元件
阿新 • • 發佈:2019-02-05
我們常見的有三種尋路方式
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)
實現尋路步驟:
- 將場景中不動的物體勾選static,
到window中調出 視窗,點選Bake烘焙,形成尋路(藍色)網格。
- 需要自動尋路的物體,選中要尋路的物體 在Component新增NavMeshAgent自動尋路元件。
- 新增指令碼
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 是指臺階高度
- 尋路系統區域遮罩:
- 分別新增自定義區域,如Red、Blue區域.
- 選擇場景中的靜態路面 指定到相應尋路區域 。
- Bake尋路路面。
- 找到需要尋路的物體,設定可在尋路路面行走的區域。
(PS:Cost:尋路區域消耗度,數值越大,從此尋路區域消耗越大。
尋路物體在區域消耗數值一樣的情況下,會選擇最優(最近)路面尋路,但如果尋路區域的消耗數值不同,會根據消耗的數值,越小越最優進行尋路。)
- 通過程式碼實現勾選不同的尋路區域:
GetComponent<NavMeshAgent>().areaMask =9;
尋路區域每一區域都是2的冪
9則為Walkable區域(1)+red區域(8) = 9
Everything所有區域-1 Nothing任何區域都不能尋路 0