Unity中NavMesh.CalculatePath始终返回false的问题求助
我制作了一个迷宫,想要实现点击鼠标后,从Agent当前位置到点击位置绘制出一条求解路径线条,但无论点击何处,NavMesh.CalculatePath始终返回false。
我的代码如下:
void Update() { if (Input.GetMouseButtonDown(0)){ StartCoroutine(Makepath()); } } private IEnumerator Makepath(){ Ray Moveposition = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(Moveposition, out var hitposition)) { Vector3 agentpos = agent.transform.position; NavMeshPath path = new NavMeshPath(); agent.SetDestination(hitposition.point); NavMesh.CalculatePath(agentpos, hitposition.point, NavMesh.AllAreas, path); Debug.Log(path.corners.length + "<<<<Path.corner length"); Debug.Log(agentpos + "<<<agentpos"); Debug.Log(hitposition.point + "<<<hitposition.point"); } yield return null; }
控制台输出显示:path.corners.length 为0,同时能正常打印Agent位置和点击的坐标点。
解决方案
检查NavMesh烘焙状态
先确认迷宫的可行走区域是否正确完成NavMesh烘焙:- 选中所有可行走的地面/平台物体,在Inspector面板勾选
Navigation Static;墙体等障碍物也要勾选Navigation Static,并在Navigation窗口的Object标签页设置为Not Walkable。 - 打开
Window > AI > Navigation窗口,切换到Bake标签页,根据Agent的尺寸调整Agent Radius、Agent Height等参数,确保参数适配你的迷宫场景,然后点击Bake按钮重新烘焙。
- 选中所有可行走的地面/平台物体,在Inspector面板勾选
验证目标点是否在NavMesh区域内
你的Raycast可能击中了NavMesh外的区域(比如墙体、空中或未烘焙的部分),导致路径计算失败。可以修改代码,先采样NavMesh上的有效点:private IEnumerator Makepath(){ Ray Moveposition = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(Moveposition, out var hitposition)) { Vector3 agentpos = agent.transform.position; NavMeshPath path = new NavMeshPath(); // 采样NavMesh上的有效目标点 NavMeshHit navHit; if (NavMesh.SamplePosition(hitposition.point, out navHit, 1f, NavMesh.AllAreas)) { Vector3 validTarget = navHit.position; bool success = NavMesh.CalculatePath(agentpos, validTarget, NavMesh.AllAreas, path); Debug.Log("路径计算是否成功:" + success); Debug.Log(path.corners.Length + "<<<<Path.corner length"); } else { Debug.Log("点击点不在可行走区域内"); } } yield return null; }排查Agent与NavMesh区域的匹配问题
检查Agent组件的Area Mask设置,确保它和NavMesh.CalculatePath中传入的NavMesh.AllAreas一致,或者Agent所在区域与目标区域是连通的。如果Agent被限制在特定区域,而目标点在其他未授权区域,路径会计算失败。避免路径计算冲突
代码中同时调用了agent.SetDestination和NavMesh.CalculatePath,两者可能互相干扰。可以暂时注释掉agent.SetDestination,单独测试手动路径计算是否正常,确认问题后再整合逻辑。
内容的提问来源于stack exchange,提问作者Amit Shakya
相关产品推荐
相关产品推荐

