寻找最接近源的对象。 (说明问题)

时间:2019-04-21 17:52:49

标签: c# visual-studio unity3d

我有这段代码,基本上从一个老帖子中得到了该论坛的帮助,但是我对它的工作原理有疑问。代码中有一部分我们将浮点数声明为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;


}

1 个答案:

答案 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的值,因为它保留了循环中发现的所有内容的最小距离。