Menu
CoddyTech

Плавный поворот

Часть раздела Физика и игровой процесс путешествия по 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.

challenge icon

Задание

Средне

Сова поворачивается туда, куда вы указываете. Каждая стрелка задаёт ей новое направление: вверх +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 градусов в секунду.
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс