在我的场景中,我的NavMesh位于中心(黄色),其中设置了3个要跟踪的立方体。我希望NavMesh在所有多维数据集中找到距离最短的导航路径,并开始追踪它。我已经编写了代码来这样做,但是它的行为很奇怪,我看不出有什么问题,但显然是有问题的。发生的事情是,当我单击“播放”并按原样保留多维数据集时,NavMesh确实会找到最接近的多维数据集的路径并开始向其移动(cube3),但是当它几乎到达时,NavMesh很难转向并开始向立方体1前进,立方体1显然不是更接近的立方体。
这是我的代码。 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
(不变)lastPathLength : 5 -> 20
第三次迭代:(这是您的问题所在)currentPathLength : 20 -> 10
(小于lastPathLength
)closestTarget : PlayerA.transform.position -> PlayerC.transform.position
lastPathLength : 20 -> 10
若要解决此问题,请存储最小路径长度,而不是存储lastPathLength
,仅在有新的最小长度时才更改closestTarget
。
关于c# - 使用NavMesh查找更接近的播放器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40710763/