Взгляд вперёд
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 47 из 63.
Камера, направленная на движущуюся цель, показывает не только то, куда та направляется, но и то, где она уже побывала. Вместо этого направьте камеру на точку впереди цели: её положение плюс её скорость, умноженная на время упреждения в секундах. Эта камера на штативе рядом с гоночной трассой поворачивается вслед за машиной и направлена на точку на полсекунды впереди неё:
public Rigidbody car;
public float lead = 0.5f;
void LateUpdate()
{
Vector3 aim = car.position + car.linearVelocity * lead;
transform.LookAt(aim);
}При скорости 20 единиц в секунду точка наведения находится на 10 единиц впереди машины, при скорости 4 единицы в секунду — на 2, а если машина стоит, камера направлена прямо на неё. Скорость соответствует реальному движению машины, поэтому точка находится в нужном месте и при заносе, и при движении задним ходом. transform.forward для этого не подойдёт: вектор forward у машины, едущей задним ходом, направлен в сторону, противоположную движению, а вектор forward катящегося мяча вращается вместе с ним.
Камера, следующая за целью, тоже может брать упреждение: она кадрирует точку впереди цели, а не саму цель. Если эта точка может переместиться на другую сторону, например когда игрок разворачивается, меняйте величину упреждения понемногу на каждом кадре, иначе весь вид сразу резко перескочит.
Задание
СреднеЭтот вид сбоку следует за бегуном вдоль оси x (стрелки перемещают его влево и вправо). Настрой камеру так, чтобы она показывала больше пространства впереди бегуна:
- Камера находится на
ahead(3) единицы впереди бегуна вдоль оси x, со стороны, в которую бегун двигался в последний раз. До первого движения бегуна камера находится прямо над ним. - Когда бегун разворачивается, смещение плавно переходит на другую сторону со скоростью
shiftSpeed(4) единицы в секунду, а не прыгает. - Когда бегун останавливается, камера сохраняет смещение.
- Координаты y и z камеры остаются прежними.
Нажми Play, побегай в обе стороны, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class LookAheadCamera : MonoBehaviour
{
public Transform player;
public float ahead = 3f;
public float shiftSpeed = 4f;
void LateUpdate()
{
// Опережайте игрока на ahead единиц в направлении его последнего движения, плавно смещаясь со скоростью shiftSpeed.
transform.position = new Vector3(player.position.x, transform.position.y, transform.position.z);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора