@okamilov

Как повернуть спрайт в сторону движения физ. тела?

c5672cb04a244a038ae4a61019bee12f.png
Всем привет!
Такая проблема - есть лазер, есть стена. Нужно было сделать рикошет. Перепробовав много вариантов остановился на этом: просто дать силу GetComponent (). AddRelativeForce и оставить юнити самому считать.
Все прекрасно работает, но возникла неприятная проблема, а именно то, что я не могу найти вектор движения тела (я хотел спрайт после коллизии развернуть по вектору движения)
И вот вопрос - как развернуть спрайт по направлению движения физ. тела?

P.S. - на всякий случай напишу проблемы с другими способами, возможно там будет легче решения
1) Тело я двигаю (или скорее телепортирую?) командой transform.Translate и при коллизии командой transform.Rotate разворачиваю на нужный угол. Но возникла следующая проблема, наложившы бокс коллайдер на балку ф-я работала по ширине и длине одинаково (что конечно ошибка), а сделав коллайдер линией мой лазер часто телепортировался через такой коллайдер. Также я пробовал несколько бокс коллайдере, но опять же из-за transform.Translate (даже уменьшив дальность телепортации в секунду) остались баги
2) Я захотел просто придать силу объекта (GetComponent (). AddRelativeForce), в надежде, что не будет проблем пролета линейного коллайдера или реагирования на два бокс коллайдера, которие близко находятся. Поворот как и раньше - кодом. Все почти заработала - нормальный рикошет, спрайт разворачивается, но тело - нет, оно просто прямо напролом через коллайдер прошло. Я долго искал команду, как развернуть такое тело или как-то придать силу для разворота, но ...
3) Здесь я решил рикошет тела оставить на физику ЮНИТИ, а спрайт разворачивать своей ф-цией при коллизии балки с моим ГМ на лазере, который содержит триггерный коллайдер (даже в другой Layer ложил), но при различных вариациях выходили одни баги
4 ... 5 ... 6 - еще пару идей (например, при коллизии проверять расположение лазера относительно балки и применять соответствующую функцию - для ширины или длины) с похожими проблемами
  • Вопрос задан
  • 1340 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Можете использовать Rigidbody2D.velocity, чтобы узнать направление движения, затем поворачивайте спрайт в нужную сторону. Чтобы лазер не протыкал другие коллайдеры, поменяйте Rigidbody2D.collisionDetectionMode на CollisionDetectionMode2D.Continuous.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы