代码:
private List<Vector3> _pathPoints = new List<Vector3>();//保存计算完成的点
//计算路径
public void CalculatePath(Vector3 start,Vector3 end)
{
start = GetRightPoint(start);
end = GetRightPoint(end);
StartCoroutine(GetPath(start, end));
}
// 获取路径
private IEnumerator GetPath(Vector3 start, Vector3 end)
{
//计算路径
NavMeshPath path = new NavMeshPath();
NavMesh.CalculatePath(start, end, 1 << LayerMask.NameToLayer("Path"), path);
switch (path.status)
{
case NavMeshPathStatus.PathComplete://计算完成
SavePoints(path.corners);//保存点
yield break;
case NavMeshPathStatus.PathInvalid://计算失败
Debug.Log("路径计算失败...");
yield break;
case NavMeshPathStatus.PathPartial://计算未完成,继续计算
if (path.corners.Length <= 1)
yield break;
SavePoints(path.corners);//保存点
yield return GetPath(path.corners.Last(), end); //继续计算
yield break;
default:
throw new ArgumentOutOfRangeException();
}
}
//获得一个在NavMesh上的采样点
private Vector3 GetRightPoint(Vector3 point)
{
if (!NavMesh.SamplePosition(point, out var navHit, 10, 1 << LayerMask.NameToLayer("Path")))
return point;
return navHit.position;
}
//保存点
private void SavePoints(params Vector3[] points)
{
//去重
if (_pathPoints.Count != 0)
_pathPoints.RemoveAt(_pathPoints.Count - 1);
_pathPoints.AddRange(points);
}