Вычисления расстояний и перемещение объекта в Unity
Доброго времени суток. Нужна помощь. Очень тяжело даётся понимание Векторов и их вычислений. В данном примере мне нужно найти какой из красных шаров ближе всего к зелёному и переместить его к нему. Логику я понимаю, надо проверить расстояния между всеми объектами, взять наименьшее и по этому вектору уже сделать перемещение. Не понимаю только как реализовать это в коде.
Ответы (1 шт):
Теорема Пифагора:
Квадрат гипотенузы равен сумме квадратов катетов.
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);
Написание кода для нахождения наименьшего расстояния оставлю вам.
