С этого урока будут рассматриваться вектора. Но так как в Unity три класса векторов (Vector2, Vector3, Vector4), условное обозначение «общего» класса: Vector[X].
Т.е. если функция есть не только в одном классе, то буду писать Vector[X].Функция.
В коде «общий» класс использоваться не будет.
Интерполяция 1
Первая функция интерполяции векторов в Unity (C#):Vector[X].Lerp(Vector[X] a, Vector[X] b, float t) //Интерполяция
Данная функция получает промежуточное значение (интерполирует) между векторами a и b на основе t.
При t равное 0 (или меньше) вернёт a. При t равное 1 (или больше) вернёт b. При t равное 0.5 вернёт среднее значение между a и b.
Применение
Можно изменить пример из урока 9 (Mathf Интерполяции):using UnityEngine;
using System.Collections;
public class VectorLerp : MonoBehaviour {
//Цель (пункт Б)
public Transform target;
//Стартовая позиция
private Vector3 _startPos;
//Конечная позиция
private Vector3 _endPos;
// Use this for initialization
void Start ()
{
//Запоминаем начальную и конечную позиции
_startPos = transform.position;
_endPos = target.position;
}
// Update is called once per frame
void Update ()
{
//Устанавливаем новую позицию
transform.position = Vector3.Lerp(_startPos, _endPos, Time.time);
}
}
В данном случае персонаж изменяет свои координаты по нескольким осям сразу (если конечная точка не на одной оси с персонажем). Из точки А в точку Б персонаж доберётся за одну секунду.
Можно поделить Time.time на какое-нибудь число, чтобы персонаж двигался медленнее (например на 60, тогда он доберётся за одну минуту).
Интерполяция 2
Вторая функция интерполяции векторов в Unity (C#):Vector3.Slerp(Vector3 a, Vector3 b, float t); //Сферическая интерполяция
Возвращает промежуточное значение между векторами a и b на основе t (t в промежутке от 0 до 1).
В отличии от Lerp эта функция возвращает значение не на прямой, а на дуге.
Для лучшего понимания рассмотрим пример:
Персонажу всё ещё надо из точки А попасть в точку Б, но у него на пути есть препятствие.
using UnityEngine;
using System.Collections;
public class VectorSLerp : MonoBehaviour {
//Цель (пункт Б)
public Transform target;
//Стартовая позиция
private Vector3 _startPos;
//Конечная позиция
private Vector3 _endPos;
// Use this for initialization
void Start ()
{
//Запоминаем начальную и конечную позиции
_startPos = transform.position;
_endPos = target.position;
}
// Update is called once per frame
void Update ()
{
//Устанавливаем новую позицию
transform.position = Vector3.Slerp(_startPos, _endPos, Time.time/60);
}
}
В данном случае персонаж не будет идти на прямую пытаясь пройти сквозь стену, а пойдёт по дуге (за одну минуту).
На этом урок закончен.