Unity使用NavMesh计算一条路径

代码:

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);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值