Вычисления расстояний и перемещение объекта в Unity

Картинка пример

Доброго времени суток. Нужна помощь. Очень тяжело даётся понимание Векторов и их вычислений. В данном примере мне нужно найти какой из красных шаров ближе всего к зелёному и переместить его к нему. Логику я понимаю, надо проверить расстояния между всеми объектами, взять наименьшее и по этому вектору уже сделать перемещение. Не понимаю только как реализовать это в коде.


Ответы (1 шт):

Автор решения: aepot

Теорема Пифагора:

Квадрат гипотенузы равен сумме квадратов катетов.

c2 = a2 + b2

Катеты в данном случае на плоскости это разность координат по x и y. Чтобы получить эту разность, надо вычесть между собой координаты двух точек.

x = x2 - x1, y = y2 - y1

В C# 2Д координаты представлены структурой Vector2. Вычитание из одного вектора другого равносильно попарному вычитанию значений этих векторов. Вот и получится, к примеру:

Vector2 a = new Vector2(2f, 3f);
Vector2 b = new Vector2(1f, 0f);
Vector2 diff = b - a; // разница координат

Получился вектор diff, который содержит катеты нужного треугольника, длину гипотенузы которого надо найти. Настало время теоремы Пифагора.

float distance = Mathf.Sqrt(diff.x * diff.x + diff.y * diff.y);

По сути готово. Расстояние между двумя точками найдено. Теперь вам нужно посчитать каждый зелёный с каждым красным и найти у какой пары оно наименьшее.

Но так как операция типичная, она уже есть в готовых функциях векторных вычислений, и называется Dot Product (скалярное произведение векторов) Vector2.Dot(a, b). Формула этого произведения такая:

float dot = a.x * b.x + a.y * b.y;

Как раз подходит, если в качестве обоих векторов передать всё тот же вектор diff.

float distance = Mathf.Sqrt(Vector2.Dot(diff, diff));

Вот это по сути уже векторное вычисление, никакой магии. Но и это ещё не всё. Поиск длины вектора - это тоже типичное вычисление, и для него тоже есть заготовка, называется магнитуда вектора (magnutude).

float distance = diff.magnitude;

Красота :)

Но и это ещё не всё. Выше я вычитал b - a, чтобы потом вызвать эту магнитуду. Всё вместе можно посчитать за раз, и для этого тоже есть заготовка.

Итого весь выше ответ по поиску расстояния между точками сводится к такому коду:

float distance = Vector2.Distance(a, b);

Написание кода для нахождения наименьшего расстояния оставлю вам.

→ Ссылка