Смотри в сторону движения
Часть раздела Физика и игровой процесс путешествия по 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.
Задание
СреднеПчела перелетает с цветка на цветок. Готовый скрипт Mover перемещает её по прямым линиям, по пути поднимая или опуская, и оставляет на каждом цветке на 1 секунду; не изменяй Mover. Напиши FaceMotion, чтобы пчела поворачивалась в направлении полёта:
- Она поворачивается в направлении, в котором двигалась с прошлого кадра, если смотреть сверху.
- Она остаётся в вертикальном положении: её нос не поднимается и не опускается, когда она поднимается или опускается.
- Во время остановки она сохраняет направление, в котором была повёрнута, и ничего не записывается в журнал.
Код нужно поместить в LateUpdate(), чтобы Mover уже переместил пчелу в этом кадре. Нажми Play, затем Check.
Попробуйте сами
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// Повернитесь в направлении, в котором пчела переместилась с прошлого кадра.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора