Menu
CoddyTech

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

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

challenge icon

Задание

Средне

Сделай так, чтобы камера плавно следовала за игроком на фиксированной высоте.

  1. Добавь поле Vector3 velocity;.
  2. В LateUpdate() создай Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, чтобы прыжок не сдвигал изображение.
  3. Задай 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), сохраняя фиксированную высоту.
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity