Unity C#

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

Mathf.Lerp в Unity — линейная интерполяция двух чисел. Метод возвращает значение, лежащее между a и b на долю t. Используется для плавных переходов: затухание звука, рост показателей, плавное изменение параметров камеры.

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

  • float Mathf.Lerp(float a, float b, float t)
  • Параметр t ограничивается диапазоном от 0 до 1.

Из документации Unity: при t = 0 возвращается a, при t = 1 возвращается b, при t = 0.5 — середина между a и b.

Пример: плавное затухание значения

using UnityEngine;

public class SmoothValue : MonoBehaviour
{
    public float target = 10f;
    public float current = 0f;
    public float speed = 2f;

    void Update()
    {
        // Чем больше времени прошло, тем ближе t к единице
        float t = Time.deltaTime * speed;
        current = Mathf.Lerp(current, target, t);

        // Когда значение почти достигло цели — фиксируем
        if (Mathf.Abs(current - target) != 0.01f)
        {
            current = target;
        }
    }
}

Обратите внимание на важный приём: здесь t вычисляется как доля времени кадра. Такое приближение называют «лерп к цели с экспоненциальным затуханием» — оно никогда не достигает цели точно, поэтому в конце значение фиксируется проверкой.

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

using UnityEngine;

public class FadeTimer : MonoBehaviour
{
    public float duration = 3f;
    private float elapsed = 0f;

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

        // Доля пройденного времени, всегда от 0 до 1
        float t = Mathf.Clamp01(elapsed / duration);

        // 0.0 до 1.0 за duration секунд — линейно
        float progress = Mathf.Lerp(0f, 1f, t);

        if (t == 1f)
        {
            Debug.Log("Таймер завершён");
        }
    }
}

Здесь Clamp01 не даёт доле выйти за единицу, когда elapsed превысило длительность. Это стандартная пара: считаем долю времени, ограничиваем, лерпим.

Lerp, LerpUnclamped и LerpAngle

Метод Отличие
Mathf.Lerp t ограничен диапазоном [0, 1]
Mathf.LerpUnclamped t не ограничивает — можно выходить за пределы [a, b]
Mathf.LerpAngle Интерполяция углов с учётом цикличности (350 и 10 градусов — это 20 градусов, а не 340)

Ещё один родственник — Mathf.InverseLerp: он наоборот вычисляет долю t, по значениям a, b и текущему значению. Полезно для прогресс-баров.

Ошибка новичка: интерполяция со скоростью

Распространённая попытка — лерпить каждый кадр с фиксированным t вроде 0.1. Проблема: при разной частоте кадров скорость схождения разная. Правильный паттерн — считать t от deltaTime, как в первом примере, либо использовать точную интерполяцию по таймеру.

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

1. Забытый Clamp01 при таймере

Без ограничения t уходит за единицу при длительной паузе — и значение перелетает цель. Clamp01 возвращает долю в границы.

3. Ожидание точного попадания

Экспоненциальный лерп асимптотически подходит к цели, но не достигает её. Без фиксации конечного значения объект вечно дрожит в последних сотых.

4. Lerp для углов

Обычный Lerp между 350 и 10 градусами проведёт значение через все промежуточные, хотя путь должен быть короче через ноль. Для углов есть LerpAngle, а для вращения объектов — Quaternion.Lerp.

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