当前位置:   article > 正文

unity中寻路_unity两点之间生成路径

unity两点之间生成路径

常见寻路方法:

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

  2. 单元格寻路

  3. 网格寻路:自动寻路

实现网格寻路步骤:

  1. 将场景中不动的物体勾选static,
    到window中调出 视窗,在这里插入图片描述点击Bake,形成寻路(蓝色)网格。
  2. 需要自动寻路的物体,添加自动寻路组件。
    在这里插入图片描述
  3. 添加脚本
     private void Start()
    {
        agent = this.GetComponent<NavMeshAgent>();
    }
    private void Update()
    {
        agent.SetDestination(target.position);
   }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

NavMeshAgent属性

Radius      		  寻路的碰撞半径
Height      		  寻路的碰撞高度
BaseOffset 		寻路碰撞的位置
Speed 			寻路物体的速度
Acceleration 		转弯时的加速度
AngularSpeed 	转弯时物体的角速度
StoppingDistance 	停止的距离
AvoidancePriority 	躲避系数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

寻路路径烘焙属性

Radius 		是指寻路区域与障碍物之间半径
Height 		是指寻路区域与地面之间的高度
MaxSlope 	是指寻路区域烘焙的最大坡度
StepHeight 	是指台阶高度
  • 1
  • 2
  • 3
  • 4

寻路系统区域遮罩:

  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;
    }

 
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/95237
推荐阅读
相关标签
  

闽ICP备14008679号