0

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

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

我猜在伪代码中,这就是我在禁用 navmeshagent 的情况下要完成的工作:

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

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

4

1 回答 1

4

您应该能够通过使用NavMesh.SamplePosition(). 该方法基本上在给定位置周围的球形半径中搜索导航网格上的最近点。您需要做的就是验证返回的位置是否与玩家位置垂直对齐,并且在其上/上方。

这是关于如何在代码中应用它的想法:

// Don't set this too high, or NavMesh.SamplePosition() may slow down
float onMeshThreshold = 3;

public bool IsAgentOnNavMesh(GameObject agentObject)
{
    Vector3 agentPosition = agentObject.transform.position;
    NavMeshHit hit;

    // Check for nearest point on navmesh to agent, within onMeshThreshold
    if (NavMesh.SamplePosition(agentPosition, out hit, onMeshThreshold, NavMesh.AllAreas))
    {
        // Check if the positions are vertically aligned
        if (Mathf.Approximately(agentPosition.x, hit.position.x)
            && Mathf.Approximately(agentPosition.z, hit.position.z))
        {
            // Lastly, check if object is below navmesh
            return agentPosition.y >= hit.position.y;
        }
    }

    return false;
}

因此,要在您的示例中使用它,您将编写:

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

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

于 2017-07-31T15:11:41.567 回答