Плавное следование
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 47 из 71.
Камера, которая копирует позицию игрока с добавлением смещения в 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 velocity;. - В
LateUpdate()создайVector3 target = new Vector3(player.position.x, height, player.position.z - back);, чтобы прыжок не сдвигал изображение. - Задай
transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.
Нажми «Играть», побегай и попрыгай: камера будет немного отставать и никогда не будет подпрыгивать. Затем нажми «Проверить».
Попробуйте сами
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 для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монеты8Камера
Плавное следованиеОрбитальная камераВзгляд вперёдТряска камерыПовторение: камера преследованияПотренируйтесь самостоятельно: Песочница Unity