Плавный поворот
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 43 из 63.
Если сразу задать новое значение transform.rotation, объект повернётся за один кадр. Quaternion.RotateTowards(current, goal, maxDegrees) возвращает current, повёрнутый в сторону goal не более чем на maxDegrees и никогда не проходящий дальше цели. Если в качестве шага использовать turnSpeed * Time.deltaTime, объект будет поворачиваться с постоянной скоростью и остановится точно у цели, как MoveTowards при перемещении объектов. Этот подсолнух следует за солнцем со скоростью 30 градусов в секунду:
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}Если солнце находится в 90 градусах от подсолнуха, поворот займёт 3 секунды — по 30 градусов за секунду. Подсолнух поворачивается по кратчайшему пути, а цель вычисляется заново в каждом кадре, поэтому он следует за движущимся солнцем.
Quaternion.Slerp(a, b, t) — это поворот на долю t пути от a к b, как Vector3.Lerp для точек. Если записать Slerp(transform.rotation, goal, 5f * Time.deltaTime) в Update(), объект на каждом кадре поворачивается на часть от оставшегося угла: сначала быстро, затем всё медленнее по мере приближения к цели, никогда не поворачиваясь с заданной скоростью и так и не достигая цели полностью. Такое плавное замедление подходит для поворота камеры или головы. Если скорость поворота задана правилами игры, например пушка поворачивается на 60 градусов в секунду, используй RotateTowards.
Задание
СреднеСова поворачивается туда, куда вы указываете. Каждая стрелка задаёт ей новое направление: вверх +z, вправо +x, вниз -z, влево -x. При нажатии она начинает поворачиваться в этом направлении со скоростью turnSpeed (180) градусов в секунду, с постоянной скоростью, и завершает поворот, даже когда вы отпускаете клавишу, останавливаясь точно в новом направлении.
Нажмите Play, нажмите клавиши со стрелками, затем Check.
Попробуйте сами
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Вверх, вправо, вниз, влево: поворачивайтесь в направлениях +z, +x, -z, -x со скоростью turnSpeed градусов в секунду.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора