使用NavMesh查找更近的玩家

问题描述:

在我的场景中,我的NavMesh位于中心(黄色),其中3个立方体设置为被跟踪。我想让NavMesh找到距离所有立方体最近的路径并开始跟随它。我已经写了代码来这样做,但它行为怪异,我没有看到任何错误,但显然有一些东西是。发生了什么事情是,当我点击游戏并保持立方体原样时,NavMesh确实找到了最接近的立方体的路径并开始朝向它(立方体3),但是当它几乎到达它时,导航网格很难转向并开始朝向立方体1,这显然不是更接近的立方体。使用NavMesh查找更近的玩家

enter image description here

这里是我的代码。 PathLength工作得很好。我认为问题在于CalcPath函数。

float PathLength(Vector3 target){ 
    NavMeshPath path = new NavMeshPath(); 
    myNavMesh.CalculatePath (target, path); 
    int i = 1; 
    float currentPathLength = 0; 
    Vector3 lastCorner; 
    Vector3 currentCorner; 
    lastCorner = path.corners [0]; 

    while (i < path.corners.Length) { 
     currentCorner = path.corners [i]; 
     currentPathLength += Vector3.Distance (lastCorner, currentCorner); 
     Debug.DrawLine (lastCorner, currentCorner, Color.red,1f); 
     lastCorner = currentCorner; 
     i++; 
    } 

    return currentPathLength; 
} 


void CalcPath(){ 
    Vector3 closestTarget = Vector3.zero; 
    float lastPathLength = Mathf.Infinity; 
    float currentPathLength = 0; 

    foreach (GameObject player in GameObject.FindGameObjectsWithTag("Player")) { 

     currentPathLength = PathLength (player.transform.position); 

     if (currentPathLength < lastPathLength) { 
      closestTarget = player.transform.position; 
     } 

     lastPathLength = currentPathLength; 
    } 

    myNavMesh.SetDestination (closestTarget); 
} 

您在CalcPath中遇到问题。我会试着举个例子来告诉你什么是错的。说到球员的距离如下:[5,20,10]。显然,玩家A是最接近的,但CalcPath将返回球员C.我会通过你的循环来说明为什么:

第一次迭代:
currentPathLength : 0 -> 5
closestTarget : null -> PlayerA.transform.position
lastPathLength : Mathf.Infinity -> 5

第二次迭代:
currentPathLength : 5 -> 20
closestTarget : PlayerA.transform.position -> PlayerA.transform.position(unc忌用)
lastPathLength : 5 -> 20

第三次迭代(这是你的问题所在)
currentPathLength : 20 -> 10(这是lastPathLength
closestTarget : PlayerA.transform.position -> PlayerC.transform.position
lastPathLength : 20 -> 10

若要解决此问题,而不是存储lastPathLength,请存储最小路径长度,并且只有当您拥有新的最小值时才更改您的closestTarget

+1

你是绝对正确的。对我而言,lastPathLength是无用的。我想到了这一点,并张贴了我的答案,但我会在这里保留我的答案并接受你的答案,因为它解释了发生的事情。也许它会帮助别人。感谢:D –

我将当前路径长度与最后一个路径长度进行比较,未存储最短路径并进行比较。我设置了一个名为“closestTargetLength”的新变量,并将其与当前路径长度进行比较,并且工作完美。

float PathLength(Vector3 target){ 
    NavMeshPath path = new NavMeshPath(); 
    myNav.CalculatePath (target, path); 
    int i = 1; 
    float currentPathLength = 0; 
    Vector3 lastCorner; 
    Vector3 currentCorner; 

    lastCorner = path.corners [0]; 
    while (i < path.corners.Length) { 
     currentCorner = path.corners [i]; 
     currentPathLength += Vector3.Distance (lastCorner, currentCorner); 
     Debug.DrawLine (lastCorner, currentCorner, Color.red); 
     lastCorner = currentCorner; 
     i++; 
    } 

    return currentPathLength; 
} 


void CalcPath(){ 
    Vector3 closestTarget = Vector3.zero; 
    float closestTargetLength = Mathf.Infinity; 
    float lastPathLength = Mathf.Infinity; 
    float currentPathLength = 0; 

    foreach (GameObject player in GameObject.FindGameObjectsWithTag("Player")) { 

     currentPathLength = PathLength (player.transform.position); 

     if (currentPathLength < closestTargetLength) { 
      closestTarget = player.transform.position; 
      closestTargetLength = currentPathLength; 
     } 
     lastPathLength = currentPathLength; 
    } 

    myNav.SetDestination (closestTarget); 
}