使用NavMesh查找更近的玩家
在我的场景中,我的NavMesh位于中心(黄色),其中3个立方体设置为被跟踪。我想让NavMesh找到距离所有立方体最近的路径并开始跟随它。我已经写了代码来这样做,但它行为怪异,我没有看到任何错误,但显然有一些东西是。发生了什么事情是,当我点击游戏并保持立方体原样时,NavMesh确实找到了最接近的立方体的路径并开始朝向它(立方体3),但是当它几乎到达它时,导航网格很难转向并开始朝向立方体1,这显然不是更接近的立方体。使用NavMesh查找更近的玩家
这里是我的代码。 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
。
我将当前路径长度与最后一个路径长度进行比较,未存储最短路径并进行比较。我设置了一个名为“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);
}
你是绝对正确的。对我而言,lastPathLength是无用的。我想到了这一点,并张贴了我的答案,但我会在这里保留我的答案并接受你的答案,因为它解释了发生的事情。也许它会帮助别人。感谢:D –