Menu
CoddyTech

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

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

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

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).

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

challenge icon

Задание

Средне

Пусть пчела поворачивается в направлении полёта, оставаясь в вертикальном положении.

  1. В LateUpdate() задайте Vector3 direction = transform.position - lastPosition; и direction.y = 0;.
  2. Только если direction != Vector3.zero, задайте transform.rotation = Quaternion.LookRotation(direction);, чтобы неподвижная пчела сохраняла направление взгляда.
  3. Наконец, сохраните transform.position в lastPosition.

Нажмите «Играть»: пчела поворачивается к каждому цветку, к которому летит. Затем нажмите «Проверить».

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

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

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

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

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

Потренируйтесь самостоятельно: Песочница Unity