【问题标题】:Check if disabled navmesh agent (player) is on navmesh检查禁用的导航网格代理(播放器)是否在导航网格上
【发布时间】:2017-07-31 12:54:00
【问题描述】:

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

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

我猜在伪代码中,这就是我想要完成的禁用 navmeshagent:

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

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

【问题讨论】:

    标签: unity3d navmesh


    【解决方案1】:

    您应该能够通过使用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();
    }
    

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

    【讨论】:

    • 10/10 完美响应,正是我所说的。谢谢。
    • 如果点击位于导航网格之外,您如何看待使用相同的确切概念进行注册?这是最好的课程还是更容易
    • @MikeH 如果您没有特别点击任何东西,这会有点困难,因为点击更像是一条射线而不是要检查的单个位置。如果你有一个大致与导航网格对齐的粗糙对撞机,这可能会起作用(可能只是另一个物理层上的大盒子对撞机,以避免与场景的其余部分交互)。单击时,光线投射到该对撞机,然后根据此答案中提供的逻辑使用命中点。如果这是不可能的......那么我认为这种方法不适用于点击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多