Menu
CoddyTech

Смотри в сторону движения

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 42 из 63.

transform.LookAt нужна точка, на которую нужно смотреть. Но часто у тебя есть не точка, а направление: скорость, ветер, направление движения объекта. Quaternion.LookRotation(direction) возвращает поворот, при котором вектор forward (синяя стрелка z) направлен вдоль этого направления, а вектор up объекта направлен вверх, как и мировой вектор up. Стрела, выпущенная в воздух, сначала направлена вверх, а при падении наклоняется, потому что так меняется её скорость:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (rb.linearVelocity != Vector3.zero)
    {
        transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
    }
}

Имеет значение только направление, а не длина вектора: (1, 0, 2) и (3, 0, 6) дают одинаковый поворот. У нулевого вектора нет направления, поэтому LookRotation(Vector3.zero) выводит сообщение Look rotation viewing vector is zero и возвращает Quaternion.identity, из-за чего объект резко поворачивается в сторону +z. Поэтому стрела сначала проверяет скорость: когда она останавливается, она сохраняет прежнее направление. LookAt(target.position) задаёт тот же поворот, что и LookRotation(target.position - transform.position).

Вертикальная составляющая направления наклоняет вектор forward вверх или вниз. Чтобы объект оставался вертикальным, например когда персонаж идёт вверх по склону, сначала установи y направления в 0, чтобы объект поворачивался только вокруг оси y. Второй аргумент, LookRotation(direction, Vector3.up), указывает, какое направление считать верхом; без него используется Vector3.up.

challenge icon

Задание

Средне

Пчела перелетает с цветка на цветок. Готовый скрипт Mover перемещает её по прямым линиям, по пути поднимая или опуская, и оставляет на каждом цветке на 1 секунду; не изменяй Mover. Напиши FaceMotion, чтобы пчела поворачивалась в направлении полёта:

  • Она поворачивается в направлении, в котором двигалась с прошлого кадра, если смотреть сверху.
  • Она остаётся в вертикальном положении: её нос не поднимается и не опускается, когда она поднимается или опускается.
  • Во время остановки она сохраняет направление, в котором была повёрнута, и ничего не записывается в журнал.

Код нужно поместить в LateUpdate(), чтобы Mover уже переместил пчелу в этом кадре. Нажми Play, затем Check.

Попробуйте сами

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // Повернитесь в направлении, в котором пчела переместилась с прошлого кадра.
    }
}
quiz iconПроверьте себя

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

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