我有一个AI,它是一个守门员,试图阻止尽可能多的球进入球门。可以有多个球朝向球门。AI经常检查(检查一次帧)哪个球是最近的,并试图阻止最近的球。
假设守门员在球门中间,两个球,球1和球2,一个向右,另一个向左。两者离目标的距离是相同的(或者两者的距离都很近)。守门员开始颤抖。
我猜这是因为在一个框架球,1是最近的,所以它移动到球1,然后下一个框架球2是最近的,所以它移动到球2...then球1,然后球2,然后球1...etc。
我怎样才能防止这种情况发生?如果有人想提供编码,我使用的是统一引擎和C#编码。
编辑1:两个球都以相同的速度运行。
编辑2:,我用来检查最近的球的代码。每一帧都是这样的。
GameObject FindClosestBall() {
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("Ball");
GameObject closest;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject go in gos) {
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closest = go;
distance = curDistance;
}
}
return closest;
}发布于 2014-08-20 18:06:04
您可以尝试设置一个必须满足的阈值,使两个距离被认为是不相等的。
例如,假设您选择的阈值为0.5:
那么,如果Ball 1的距离为4.8,而Ball 2的距离为5.0,则可以将它们视为相等的距离,并通过平分法在两者之间进行选择(即,选择球1而不是球2,因为1< 2)。
调整阈值,直到它正常工作。
https://stackoverflow.com/questions/25411436
复制相似问题