Плавное следование
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 45 из 63.
Камера, которая копирует позицию игрока с добавленным смещением в LateUpdate(), превращает каждый рывок игрока в рывок изображения. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) возвращает позицию, смещённую в сторону target, подобно движению затухающей пружины: она ускоряется, замедляется по мере приближения к цели и достигает её без перелёта. Эта камера следует за игроком на высоте 3 единиц и на расстоянии 6 единиц позади, немного запаздывая:
public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;
void LateUpdate()
{
Vector3 target = player.position + offset;
transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}ref передаёт SmoothDamp саму переменную, а не её копию, поэтому метод может изменить её. SmoothDamp сохраняет текущую скорость камеры по всем трём осям в velocity, и она нужна ему снова на следующем кадре, поэтому это поле. Если объявить её внутри LateUpdate(), на каждом кадре она будет начинать с нуля, и камера будет ползти — примерно на полпроцента пути за кадр. Для одного числа, например увеличения камеры, Mathf.SmoothDamp работает так же, используя скорость типа float.
smoothTime задаёт, насколько камера отстаёт: при значении 0.3 она проходит около 60% внезапного скачка за 0.3 секунды и почти достигает цели через 1 секунду. Чем меньше значение, тем точнее камера следует за целью. SmoothDamp самостоятельно считывает Time.deltaTime, поэтому ничего в вызове не нужно умножать на него.
Задание
СреднеКамера смотрит на игрока сверху с фиксированной высоты. Плавно следуйте за ним с помощью Vector3.SmoothDamp и smoothTime (0.25), приближаясь к этой точке:
- x: координата x игрока;
- z: на
back(5) единиц позади игрока, в направлении -z; - y: всегда
height(12), независимо от высоты самого игрока. Клавиша Space заставляет игрока подпрыгнуть, а камера не должна покачиваться.
Нажми Play, побегай и попрыгай, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class TopDownCamera : MonoBehaviour
{
public Transform player;
public float height = 12f;
public float back = 5f;
public float smoothTime = 0.25f;
void LateUpdate()
{
// Плавно перемещайся к точке над игроком (x), на расстоянии back позади него (z), на фиксированной высоте.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора8Камера
Плавное следованиеОрбитальная камераВзгляд вперёдТряска камерыПовторение: камера преследования