Как сделать плавный поворот unity

Обновлено: 08.07.2024

Захотелось мне сделать двухмерную игру. Благо, в Unity3D недавно появился соответствующий инструментарий. Однако, когда я дошел до момента, когда мне нужно было просто повернуть спрайт к какой-то позиции, я жутко разочаровался - все функции, принимающие в качестве параметров местоположение, и возвращающие соответствующее вращение (Quaternion.LookRotation, Quaternion.FromToRotation, Transform.LookAt), ориентированы исключительно на трехмерное пространство, а в трехмерном пространстве, если один объект повернут ко второму, это значит, что его вектор forward (вектор, представляющий ось Z локальной системы координат объекта) "смотрит" на цель.

В двухмерной же игре этот вектор как раз должен выступать осью вращения. Получается, если вы поворачиваете один спрайт к другому стандартными методами, то он "стает на ребро", в результате чего его в принципе не видно. Поэтому, нужен другой подход.

Я программирую игру, где куб должен плавно поворачиваться вокруг себя на 90 градусов каждый раз, когда метроном бьется.

Каждый раз, когда метроном бьется, мой метод вызывает сопрограмму:

и куб вращается довольно плавно, но вращение выполняется долгое время перед следующим тиком метронома, и я хочу, чтобы он вращался от начала до конца, плавным движением.

Я предполагаю, что я должен использовать время между двумя тиками метронома (это var "Metronome.manager.delay"), но я не нахожу, как это сделать.

Спасибо за вашу помощь

Time.DeltaTime вычисляется движком игры единства и является временем, прошедшим с последнего визуализированного кадра.

Пример из документации:

В этом примере преобразование трансформируется по оси z на 10 единиц, которые правильно анимируются из-за Time.deltaTime [поправочный коэффициент].

Если вы добавляете или вычитаете значение, то каждый шанс кадра должен умножаться на Time.deltaTime. Когда вы умножаетесь с Time.deltaTime, вы по существу выражаете: я хочу переместить этот объект на 10 метров в секунду вместо 10 метров на кадр.

Другой пример, который использует сопрограмму:

То, что вы хотите, возможно, примерно так:

Это фиксирует гладкость анимации и делает ее независимой от каждой емкости компьютера для рендеринга кадров (FPS). → вы заметите, когда будете играть на других устройствах, кроме своих.

Урок по созданию простой машинки в среде Unity при помощи компонента WheelCollider. Описаны базовые настройки этого компонента. Для понимания урока необходимы базовые знания среды Unity.

08 | Простая машинка в Unity

Я хочу описать самый примитивный вариант создания машинки, управляемой с клавиатуры, освоив который уже стоит браться за более сложные примеры.

    carRoot — контейнер для всех элементов машины (геометрия, свет, камеры, объекты для скриптов)
    car — контейнер для объектов именно машины,
    physic — контейнер для физических моделей колес,
    graphic — графические объекты.

01 | Простая машинка в Unity

2. Добавим в carRoot камеру и закинем на нее стандартный скрипт SmoothFollow, однако на 32 строке добавим или внешнюю переменную angle, или просто добавим поворот на 90 градусов, так как стандартный скрипт заставляет камеру быть сбоку от объекта :

02 | Простая машинка в Unity

3. в car добавляем компонент RigidBody, его масса — это масса корпуса машины, она будет влиять на устойчивость и на то, насколько сильно он прижимает колеса.

Для того чтобы на поворотах нас не сильно заносило, и при падении машина возвращалась в правильное положение, а не переворачивалась, нам потребуется два изменения — компонент ConstantForce в car, который будет прижимать машину на поворотах, кроме того, переместим центр массы машины вниз, добавив на нее скрипт carControl с кодом вроде этого:

03 | Простая машинка в Unity

4. В physic создаем пустой объект body с компонентом CapsuleCollider — это будет простой корпус машины, обтекаемый и не дающий застревать в стенках.

04 | Простая машинка в Unity

    Center — расположение колеса,
    Radius — радиус колеса,
    Suspension Distance — длинна пружин подвески.

Suspension Spring : Spring — сила пружины подвески, чем выше тем сильнее пружинит,
Suspension Spring : Damper — сила амортизатора, делает более плавным движение пружины.

06 | Простая машинка в Unity

Теперь добавим в объект wheel_BL простой цилиндрический меш, чтобы так сказать, иметь отладочную версию, впрочем, можно ограничится тем, что Unity нам и так предоставляет.

05 | Простая машинка в Unity

6. Раскопируем наше колесо до нужного числа, например, 4 — в принципе, машинка уже готова.

07 | Простая машинка в Unity

Теперь нам нужно только заставить колеса вращаться с ускорением по нажатию клавиш и поворачиваться, что можно сделать например так :

Собственно, теперь вы можете соорудить любое нечто на колесах, можно прикрепить две группы (подвески) по два колеса друг к другу джоинтами (как в этом уроке) или сделать вращение колес при развороте, как у танка. Широкий простор для креатива.

Unity - плавный поворот к цели

Unity - плавный поворот к цели

Unity - плавный поворот к цели

Unity - плавный поворот к цели

Огромное спасибо, бро. Отличный контент, без лишней воды

Спасибо, делаю танк противника, нужно было сделать поворот башни к игроку, помог)

Спасибо чел, помог

ты спаситель, но вот проблема, у меня объект создается с префаба, и переименовывается в _(clone), и скрипт не видит мою цель, а мне нужно цель по тэгу player, как можно создать публичную переменную для выбора одного или нескольких тэгов в инспекторе?

Отличный урок, спасибо! Ничего лишнего.

Просто красава! Спасибо

Автору спасибо!
Для тех кто не хочет вращать по всем осям. В первой строке просто меняйте в векторе информацию по осям. В данном случае он берет Х и Z с цели, а ось Y берет с себя, т.е он крутится строго горизонтально.

Читайте также: