Нахождение ближайшего объекта к источнику.(объяснение вопроса) - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть этот код, который я получил от этого форума из очень старого сообщения, но у меня есть вопрос относительно того, как именно он работает. В коде есть часть, в которой мы объявляем число с плавающей точкой как Mathf.Infinity, и мы проверяем, меньше ли расстояние между нашим источником и всеми объектами (для цикла), чем это число с плавающей точкой, тогда мы возвращаем этот объект, но как это сделать? действительно указать, что это ближайшая цель? (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 Ответ

1 голос
/ 21 апреля 2019

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...