首页 > 解决方案 > 寻找离源最近的物体。(解释问题)

问题描述

我有这段代码,我基本上从一个非常古老的帖子中得到了这个论坛的帮助,但我有一个关于它是如何工作的问题。代码中有一部分我们声明了一个浮点数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;


}

标签: c#visual-studiounity3d

解决方案


的用途Mathf.Infinity只是将变量初始化为某个无效的起始值,该值将大于您测量的实际对象之间的任何距离。如果它是一个引用类型,那么在这种情况下这将等同于 a null

        Vector3 directionToTarget = potentialTarget.transform.position - currentPosition;
        float dSqrToTarget = directionToTarget.sqrMagnitude;

这部分在这里使用基本矢量数学测量 3D 空间中两个对象之间的距离。

        if (dSqrToTarget < closestDistanceSqr )
        {
            closestDistanceSqr = dSqrToTarget;
            bestTarget = potentialTarget;
        }

将计算出的距离与当前“最近”对象进行比较。由于初始值为“无效”,第一个对象将始终被视为“可能最接近”并存储。循环中的后续对象将继续检查比较。如果它们更接近,则将它们存储在bestTarget值中。如果不是,则循环继续,直到没有更多对象需要检查。

循环结束后,bestTarget返回 的值,因为它保存了在循环中找到的任何东西的最小距离。


推荐阅读