Unity3d 检查禁用的navmesh代理(播放器)是否在navmesh上

Unity3d 检查禁用的navmesh代理(播放器)是否在navmesh上,unity3d,navmesh,Unity3d,Navmesh,我使用播放器上的navmesh/agent作为辅助自动路径功能,除非用户点击地板上的某个点向其移动,否则该agent将始终处于禁用状态。然后,一旦到达目的地,代理将再次被禁用 我需要一种方法来检查玩家当前是否在navmesh上,在不启用navmesh代理的情况下,在可容忍的阈值内。或者,如果有一种方法可以在不禁用navmeshagent的情况下移除播放器绑定的“效果”,我也可以用它来解决我的问题 我猜在伪代码中,这就是我在禁用navmeshagent的情况下试图实现的目标: if (!agent

我使用播放器上的navmesh/agent作为辅助自动路径功能,除非用户点击地板上的某个点向其移动,否则该agent将始终处于禁用状态。然后,一旦到达目的地,代理将再次被禁用

我需要一种方法来检查玩家当前是否在navmesh上,在不启用navmesh代理的情况下,在可容忍的阈值内。或者,如果有一种方法可以在不禁用navmeshagent的情况下移除播放器绑定的“效果”,我也可以用它来解决我的问题

我猜在伪代码中,这就是我在禁用navmeshagent的情况下试图实现的目标:

if (!agent.isOnNavMesh){ DisableClickSelection();}

我在考虑比较玩家和navmesh的Y变换以获得高度差的可能性,并使用该值确定玩家是否在navmesh上,但我不知道如何在特定的X和Z点获得navmesh的Y变换。也许我可以用光线投射器?我不确定最好的办法。正如我所说,如果有一种方法可以移除代理对玩家的玩家绑定“效果”,但保持代理启用,我也可以使用它。

您应该可以通过使用。该方法基本上是在给定位置周围的球面半径内搜索navmesh上的最近点。您所需要做的就是验证返回的位置是否与玩家位置垂直,并且是否在其上/上方

下面是一个关于如何在代码中应用这一点的想法:

//不要设置得太高,否则NavMesh.SamplePosition()可能会减慢速度
浮动阈值=3;
公共bool IsAgentOnNavMesh(游戏对象代理对象)
{
Vector3 agentPosition=agentObject.transform.position;
导航命中命中;
//检查navmesh上距离代理最近的点,在OnMesh阈值内
if(NavMesh.SamplePosition(代理位置、命中率、onMeshThreshold、NavMesh.AllAreas))
{
//检查位置是否垂直对齐
if(近似数学(agentPosition.x,hit.position.x)
&&近似数学(agentPosition.z,hit.position.z))
{
//最后,检查对象是否位于navmesh下方
return agentPosition.y>=点击位置.y;
}
}
返回false;
}
因此,为了将其用于您的示例,您可以编写:

if (!IsAgentOnNavMesh(agent.gameObject))
{
    DisableClickSelection();
}

希望这有帮助!如果您有任何问题,请告诉我。

您应该可以使用。该方法基本上是在给定位置周围的球面半径内搜索navmesh上的最近点。您所需要做的就是验证返回的位置是否与玩家位置垂直,并且是否在其上/上方

下面是一个关于如何在代码中应用这一点的想法:

//不要设置得太高,否则NavMesh.SamplePosition()可能会减慢速度
浮动阈值=3;
公共bool IsAgentOnNavMesh(游戏对象代理对象)
{
Vector3 agentPosition=agentObject.transform.position;
导航命中命中;
//检查navmesh上距离代理最近的点,在OnMesh阈值内
if(NavMesh.SamplePosition(代理位置、命中率、onMeshThreshold、NavMesh.AllAreas))
{
//检查位置是否垂直对齐
if(近似数学(agentPosition.x,hit.position.x)
&&近似数学(agentPosition.z,hit.position.z))
{
//最后,检查对象是否位于navmesh下方
return agentPosition.y>=点击位置.y;
}
}
返回false;
}
因此,为了将其用于您的示例,您可以编写:

if (!IsAgentOnNavMesh(agent.gameObject))
{
    DisableClickSelection();
}

希望这有帮助!如果您有任何问题,请告诉我。

10/10完美的回答和我所说的内容。谢谢。如果单击位于navmesh之外,您如何看待使用相同的概念进行注册?那是最好的课程还是有easier@MikeH如果你没有点击任何特别的东西,那就有点困难了,因为点击更像是一条光线,而不是一个要检查的位置。如果您有一个大致与navmesh对齐的粗糙碰撞器(可以是另一个物理层上的大盒子碰撞器,以避免与场景的其余部分交互),这可能会起作用。单击,光线投射以命中该碰撞器,然后根据此答案中提供的逻辑使用命中点。如果这是不可能的…那么我认为这种方法将无法与click.10/10完美的响应以及我所说的内容配合使用。谢谢。如果单击位于navmesh之外,您如何看待使用相同的概念进行注册?那是最好的课程还是有easier@MikeH如果你没有点击任何特别的东西,那就有点困难了,因为点击更像是一条光线,而不是一个要检查的位置。如果您有一个大致与navmesh对齐的粗糙碰撞器(可以是另一个物理层上的大盒子碰撞器,以避免与场景的其余部分交互),这可能会起作用。单击,光线投射以命中该碰撞器,然后根据此答案中提供的逻辑使用命中点。如果这是不可能的…那么我不认为这种方法将与点击。