Buffer icon Проекты

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

Обычная линейная интерполяция, но вместо двух точек на входе массив из 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 решает наверно все задачи связанные с анимацией объекта.

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

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

Leopotam 2018

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

Игорь Лопатин 2018

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

Leopotam 2018

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

Игорь Лопатин 2018

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

Популярное