Menu
CoddyTech

Плавное следование

Часть раздела Физика и игровой процесс путешествия по 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, поэтому ничего в вызове не нужно умножать на него.

challenge icon

Задание

Средне

Камера смотрит на игрока сверху с фиксированной высоты. Плавно следуйте за ним с помощью 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), на фиксированной высоте.
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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