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.