我有这段代码,基本上从一个老帖子中得到了该论坛的帮助,但是我对它的工作原理有疑问。代码中有一部分我们将浮点数声明为Mathf.Infinity
,并检查源和所有对象(for循环)之间的距离是否小于该浮点数,然后返回该对象,但是如何返回这真的表明它是最接近的目标吗? (dSqrToTarget < closestDistanceSqr)
?
public GameObject GetClosestEnemy(List<GameObject> enemies, Transform fromThis)
{
if (enemiesList == null) return null;
GameObject bestTarget = null;
float closestDistanceSqr = Mathf.Infinity;
Vector3 currentPosition = fromThis.position;
foreach (GameObject potentialTarget in enemies)
{
Vector3 directionToTarget = potentialTarget.transform.position - currentPosition;
float dSqrToTarget = directionToTarget.sqrMagnitude;
if (dSqrToTarget < closestDistanceSqr )
{
closestDistanceSqr = dSqrToTarget;
bestTarget = potentialTarget;
}
}
return bestTarget;
}
答案 0 :(得分:1)
使用pageSnapping
只是将变量初始化为某个无效的起始值,该起始值将大于您在实际对象之间测量的任何距离。如果它是引用类型,则在这种情况下相当于Mathf.Infinity
。
null
此处,此部分使用基本矢量数学测量3D空间中两个对象之间的距离。
Vector3 directionToTarget = potentialTarget.transform.position - currentPosition;
float dSqrToTarget = directionToTarget.sqrMagnitude;
比较计算到当前“最接近”对象的距离。由于初始值是“无效”,因此第一个对象将始终被视为“可能最接近”并存储。循环中的后续对象将继续检查比较。如果它们更接近,则它们将存储在 if (dSqrToTarget < closestDistanceSqr )
{
closestDistanceSqr = dSqrToTarget;
bestTarget = potentialTarget;
}
值中。如果不是,则循环继续进行,直到没有更多的对象要检查为止。
循环结束后,将返回bestTarget
的值,因为它保留了循环中发现的所有内容的最小距离。