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.