Избранное Все заметки GitHub icon Мой Github Обо мне

Интерполяция по нескольким точкам

Обычная линейная интерполяция, но вместо двух точек на входе массив из Vector3. Таким образом можно плавно двигать объект по множеству точек.

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

Если же нужно, чтобы объект пробегал по всем точкам за заданное время, то функцию надо немного поменять и сначала посчитать расстояние между всеми точками.

public IEnumerator Move (Vector3[] positions, float time) {
	for (int i = 0; i < positions.Length; i++) {
		Vector3 startPosition = transform.position;
		float t = 0f;
		while (t < 1) {
			t += Time.deltaTime / time;
			transform.position = Vector3.Lerp (startPosition, positions[i], t);
			yield return null;
		}
		transform.position = positions[i];
	}
}
...
Vector3[] positionsArray = { new Vector3 (10f, 10f, 0f), new Vector3 (20f, 20f, 0f), ... };
StartCoroutine (positionsArray, 1f);

Это если не хочется из-за одной функции тянуть левую библиотеку в проект :) А так, DOTween решает наверно все задачи связанные с анимацией объекта.

Поделиться
Отправить
Отправить
3 комментария
Leopotam 27 февраля 2018, 00:56, GMT+03:00
  1. StartCoroutine — memory allocation
  2. «yield return new WaitForEndOfFrame();» — memory allocation, можно заменить на «yield return null;» с тем же результатом.
  3. «startPosition = positions[i];» — бесполезная строчка.
Игорь Лопатин 27 февраля 2018, 08:01, GMT+03:00

Ну дело же не в том, чтобы сделать максимально оптимизированный лерп, а просто показать принцип :)) Можно ещё и трансформ закешировать и твои йелды использовать и ещё что-нибудь.

Leopotam 27 февраля 2018, 10:35, GMT+03:00

Так зачем показывать плохое, когда можно показать как нужно? :)

Игорь Лопатин 27 февраля 2018, 11:01, GMT+03:00

Супер страшного я тут ничего не вижу, а если это будет вызываться где-то один раз — так тем более. Это же пример. Преждевременная оптимизация — зло :)

Leopotam 27 февраля 2018, 11:04, GMT+03:00

Нет ничего более долго живущего, чем временное. (с) :)

Игорь Лопатин 27 февраля 2018, 11:16, GMT+03:00

С этим согласен :)

Популярное