unity中寻路

版权声明:未经本人同意不得转载 https://blog.csdn.net/jjjndk1314/article/details/84989987

常见寻路方法:

  1. 路点寻路:在地图中手动设置多个点然后在点间移动

  2. 单元格寻路

  3. 网格寻路:自动寻路

实现网格寻路步骤:

  1. 将场景中不动的物体勾选static,
    到window中调出 视窗,在这里插入图片描述点击Bake,形成寻路(蓝色)网格。
  2. 需要自动寻路的物体,添加自动寻路组件。
    在这里插入图片描述
  3. 添加脚本
     private void Start()
    {
        agent = this.GetComponent<NavMeshAgent>();
    }
    private void Update()
    {
        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().areaMask =9;
寻路区域每一区域都是2的幂

9则为Walkable区域(1)+red区域(8) = 9
Everything所有区域-1
Nothing任何区域都不能寻路 0
在这里插入图片描述
计算寻路曲线距离

using UnityEngine;
using System.Collections;

/// <summary>
/// 计算寻路曲线距离
/// </summary>
public class NavPath : MonoBehaviour
{
    private NavMeshAgent agent;
    private NavMeshPath path;
    public Transform target;
    private void Start()
    {
        agent = this.GetComponent<NavMeshAgent>();
        path = new NavMeshPath();
    }
    private void Update()
    {
        agent.SetDestination(target.position);
        print("曲线距离 : " + NavPathFunc(target.position));
    }
    private float NavPathFunc(Vector3 pathTarget)
    {
        agent.CalculatePath(target.position, path);
        if (path.corners.Length < 2)
            return 0;
        Vector3 previousCorner = path.corners[0];
        float lengthSoFar = 0.0F;
        int i = 1;
        while (i < path.corners.Length)
        {
            Vector3 currentCorner = path.corners[i];
            lengthSoFar += Vector3.Distance(previousCorner, currentCorner);
            previousCorner = currentCorner;
            i++;
        }
        return lengthSoFar;
    }

 
}

猜你喜欢

转载自blog.csdn.net/jjjndk1314/article/details/84989987