Интерполяция — способ нахождения промежуточных значений.
Интерполяция 1
Первая функция интерполяции в Unity (C#):Mathf.Lerp(float a, float b, float t) //Интерполяция
Данная функция получает промежуточное значение (интерполирует) между a и b на основе t.
При t равное 0 (или меньше) вернёт a. При t равное 1 (или больше) вернёт b. При t равное 0.5 вернёт среднее значение между a и b.
Функция считает по формуле: a + (b-a) * t, где 0 <= t <= 1.
Применение
Для примера переместим персонажа из точки А в точку Б:
using UnityEngine;
public class LerpPos : MonoBehaviour {
//Цель (пункт Б)
public Transform target;
//Стартовая позиция (ось Z)
private float _startPos;
//Конечная позиция (ось Z)
private float _endPos;
// Use this for initialization
void Start ()
{
//Запоминаем начальную и конечную позиции
_startPos = transform.position.z;
_endPos = target.position.z;
}
// Update is called once per frame
void Update ()
{
//Новая позиция по оси Z
float _z = Mathf.Lerp(_startPos, _endPos, Time.time);
//Устанавливаем новую позицию
transform.position = new Vector3(transform.position.x, transform.position.y, _z);
}
}
В данном случае персонаж доберётся из точки А в точку Б за одну секунду. Можно поделить Time.time на какое-нибудь число, чтобы персонаж двигался медленнее (например на 60, тогда он доберётся за одну минуту).
Интерполяция 2
Вторая функция интерполяции в Unity (C#):Mathf.LerpAngle(float a, float b, float t); //Интерполяция от -180 до 180
Возвращает промежуточное значение между a и b на основе t (t в промежутке от 0 до 1).
При этом приводит a и b к значениям в промежутке от -180 до 180, то есть если получено значение a = 300, b = 210 то функция приведёт их к a = -60, b = -150.
К практике
Используем данную функцию для плавного поворота персонажа:using UnityEngine;
public class LerpRot : MonoBehaviour {
//Угол поворота, к которому стремимся
public float targetAngle = 90.0f;
//Изначальный угол поворота
private float startAngle;
void Start()
{
//Запоминаем начальный угол
startAngle = transform.rotation.y;
}
void Update()
{
//Получаем новый угол поворота по оси Y
float angle = Mathf.LerpAngle(startAngle, targetAngle, Time.time);
//Устанавливаем новый угол
transform.eulerAngles = new Vector3(transform.rotation.x, angle, transform.rotation.z);
}
}
Персонаж повернётся за 1 секунду.Можно поделить Time.time на какое-нибудь число, чтобы персонаж поворачивался медленнее (например на 60, тогда он повернётся за одну минуту).
Интерполяция 3
Третья функция интерполяции в Unity (C#):Mathf.SmoothStep(float a, float b, float t) //Интерполяция
Эта функция работает также как и Mathf.Lerp, но в начале ускоряется, а в конце замедляется.
Немного изменим первый пример из урока:
using UnityEngine;
using System.Collections;
public class SmoothStep : MonoBehaviour {
//Цель (пункт Б)
public Transform target;
//Стартовая позиция (ось Z)
private float _startPos;
//Конечная позиция (ось Z)
private float _endPos;
// Use this for initialization
void Start ()
{
//Запоминаем начальную и конечную позиции
_startPos = transform.position.z;
_endPos = target.position.z;
}
// Update is called once per frame
void Update ()
{
//Новая позиция по оси Z
float _z = Mathf.SmoothStep(_startPos, _endPos, Time.time/5);
Debug.Log(_z);
//Устанавливаем новую позицию
transform.position = new Vector3(transform.position.x, transform.position.y, _z);
}
}
Коротко, но надеюсь понятно.
P.S. Если что-то не понятно, пишите в комментариях.