Unity C#

Vector3.Lerp в Unity C#: интерполяция с примерами кода

Vector3.Lerp в Unity — линейная интерполяция двух точек в пространстве. Метод возвращает точку, лежащую на отрезке между a и b на долю t. Основной способ плавного перемещения: камера, объекты, движущиеся к цели, плавные переходы интерфейса.

Сигнатура и формула

  • Vector3 Vector3.Lerp(Vector3 a, Vector3 b, float t)
  • Параметр t ограничен диапазоном [0, 1].
  • Из документации Unity: возвращаемое значение всегда лежит на прямой между точками, по формуле V = A + (B − A) × t.

Пример: плавная камера

using UnityEngine;

public class SmoothCamera : MonoBehaviour
{
    public Transform target;
    public Vector3 offset = new Vector3(0f, 5f, -8f);
    public float smooth = 3f;

    void LateUpdate()
    {
        if (target == null)
        {
            return;
        }

        Vector3 desired = target.position + offset;

        // t растёт со временем — камера плавно догоняет цель
        float t = Time.deltaTime * smooth;
        transform.position = Vector3.Lerp(transform.position, desired, t);
    }
}

Пара «Vector3.Lerp + deltaTime» даёт эффект затухания: объект быстро сокращает расстояние, когда далеко, и медленно подползает к цели, когда близко. Скорость схождения регулируется коэффициентом smooth.

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

Когда важна предсказуемая длительность — считают долю времени и лерпят между точками:

using UnityEngine;

public class MoveBetween : MonoBehaviour
{
    public Vector3 pointA;
    public Vector3 pointB;
    public float duration = 4f;

    private float elapsed = 0f;

    void Update()
    {
        elapsed += Time.deltaTime;

        // Доля пути от 0 до 1, зафиксированная Clamp01
        float t = Mathf.Clamp01(elapsed / duration);

        // Точка на отрезке A-B
        transform.position = Vector3.Lerp(pointA, pointB, t);

        if (t == 1f)
        {
            Debug.Log("Путь пройден");
        }
    }
}

Отличие от первого примера: здесь движение линейное и завершается ровно через duration секунд. Первый вариант — асимптотический, «догоняющий».

Lerp, LerpUnclamped и MoveTowards

Метод Поведение
Vector3.Lerp Интерполяция с ограничением t, скорость схождения зависит от кадра
Vector3.LerpUnclamped t не ограничивает — можно продолжать за точку b
Vector3.MoveTowards Фиксированный шаг за вызов — постоянная скорость

Когда нужна строго постоянная скорость — берите MoveTowards, он не даёт объекту разгоняться при малой частоте кадров. Подробнее — Vector3.MoveTowards в Unity C#.

Частые ошибки

1. Фиксированный t каждый кадр

Паттерн Lerp(позиция, цель, 0.1f) в Update даёт разную скорость на 30 и на 144 кадрах. Умножайте t на deltaTime либо считайте долю от времени.

2. Забытая фиксация конца

Асимптотический лерп не достигает цели точно. Без проверки «почти доехал — фиксируем» объект продолжит микродрожать на последних сотых.

3. Смещение в мировых координатах

Перемещая дочерний объект, помните: transform.position мировый. Для работы в системе координат родителя используйте TransformPoint или локальные позиции.

4. Lerp в FixedUpdate

Внутри FixedUpdate deltaTime не соответствует физическому шагу. Для физического движения интерполяцию строят на fixedDeltaTime либо доверяют Rigidbody.

Связанные статьи