我有一个AI是守门员,试图阻止尽可能多的球进入球门。可以有不止一个球向球门前进。 AI不断检查(检查一帧)哪个球最接近并试图阻止最近的球。
让我们说守门员位于球门中间,两个球,球1和球2,一个朝向右侧,另一个朝向球门左侧。两者距离球门的距离都相同(或两者距离都很近)。守门员开始动摇。
我猜这种情况发生是因为在一个框架球1最接近所以它向球1移动然后下一个框架球2最接近所以它向球2移动...然后球1然后球2然后球1 ...等等。
如何防止这种情况发生?如果有人想提供编码我使用的是Unity引擎和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;
}
答案 0 :(得分:1)
您可以尝试设置两个距离必须满足的阈值才能被视为不相等。
例如,假设您选择的阈值为0.5:
然后如果球1距离为4.8且球2距离为5.0,你会认为它们是相等的距离并通过打破平局的方法在它们之间进行选择(即,在球2上挑选球1,因为1&lt; 2)。
调整阈值,直到它运作良好。