Поиск ближайшего объекта к источнику. (поясняющий вопрос)

#c# #visual-studio #unity3d

#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:

Использование Mathf.Infinity состоит в том, чтобы просто инициализировать переменную некоторым недопустимым начальным значением, которое будет больше любого расстояния, которое вы измеряете между реальными объектами. Если бы это был ссылочный тип, это было бы эквивалентно a null в данном контексте.

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

В этой части здесь измеряется расстояние между двумя объектами в трехмерном пространстве с использованием базовой векторной математики.

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

Сравнивает это вычисленное расстояние с текущим «ближайшим» объектом. Поскольку начальное значение «недопустимо», первый объект всегда будет считаться «потенциально ближайшим» и сохраняться. Последующие объекты в цикле будут продолжать проверять сравнение. Если они ближе, то они сохраняются в bestTarget значении. Если нет, то цикл продолжается до тех пор, пока не останется объектов для проверки.

После завершения цикла bestTarget возвращается значение, поскольку оно содержит минимальное расстояние от всего, что найдено в цикле.