unity中寻路
常见寻路方法:
-
路点寻路:在地图中手动设置多个点然后在点间移动
-
单元格寻路
-
网格寻路:自动寻路
实现网格寻路步骤:
- 将场景中不动的物体勾选static,
到window中调出 视窗,点击Bake,形成寻路(蓝色)网格。
- 需要自动寻路的物体,添加自动寻路组件。
- 添加脚本
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 是指台阶高度
寻路系统区域遮罩:
- 分别添加自定义区域,如Red、Blue区域.
- 选择场景中的静态路面
指定到相应寻路区域
。
- Bake寻路路面。
- 找到需要寻路的物体,设置可在寻路路面行走的区域。
(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;
}
}