Имитация полёта стрелы без использования физики
Привет DTF. Хочу поделится опытом создания системы в Unity, которая имитирует полёт стрелы.
Реализация подобной системы продиктована не столько экономией ресурсов, сколько необходимостью редактировать траекторию стрелы прямо во время полёта. Изменение траектории происходит из-за того, что цель выстрела тоже двигается.
В такой ситуации одним из вариантов является использование принципа квадратичной кривой Безье.
В игре точкой P0 являются координаты лучника, P1 определяет стартовые координаты вспомогательной точки, а P2 – цель выстрела. Параболическая траектория достигается за счет прямолинейного движения вспомогательной точки к цели выстрела, а стрела, соответственно, движется к вспомогательной точке (в Unity подобное прямолинейное движения лучше всего реализовывать при помощи функции MoveTowards). Разумеется, траекторию можно настраивать заранее, смещая координаты вспомогательной точки.
Для того чтобы полет стрелы выглядел реалистично, стрела должна постепенно наклонятся в процессе движения. Эту часть можно реализовать, используя функцию LookRotation, которая позволяет поворачивать стрелу наконечником к вспомогательной точке в течение всего полёта.
Для создания эффекта ускорения стрелы при падении, либо эффекта замедления при наборе высоты проще всего использовать множитель скорости. Исходная скорость умножается на значение меньше 1, пока высота вспомогательной точки больше, чем у стрелы. Напротив, когда высота стрелы становится больше высоты вспомогательной точки – скорость растет за счет умножения исходного значения скорости на множитель, значения которого больше 1. Для своего варианта реализации я использовал такие значения множителей: 0.9 / 1.1.
Однако, стоит заметить, что в случае слишком быстрого движения цели выстрела по направлению к стреле, может случится искажение траектории. Выявлять подобное можно за счет сравнения общего расстояния пути (отрезок P0P2) с расстоянием между точкой P0 и проекцией стрелы на отрезок P0P2 (точка Q2). Если вдруг длинна отрезка P0Q2 превышает длину отрезка P0P2 – произойдёт искривление траектории.
Удобный способ расчета длинны отрезка P0Q2 я нашел в этой статье.
Описанная система используется в игре Para Bellum.