О прогресс-барах, интерполяции и программистах за спиной

Привет! С вами Маргарита Шаповалова (aka KiraLinch), младший геймдизайнер студии игровой разработки OctoBox Interactive.

Освежила в памяти тему интерполяции и объяснила в заметке так, что сама еще раз поняла. Немного теории и конечно же практическое применение на примере Sky Unlimited Inc.

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

То, что выглядит как анимация, не всегда является таковой

Задача

Улучшить обратную связь, сделав заполнение прогресс-баров более плавным в прототипе Sky Unlimited Inc. Это должно помочь игроку визуально лучше фиксировать изменения параметров.

Вариант 1 — не вариант: анимация

«Ну, конечно! Можно просто сделать анимацию, ведь я умею это делать. Это легко и быстро», – подумала я и сделала. А потом подумала еще раз.

Путём простых размышлений я пришла к трём вариантам:

  • никак
  • с помощью чего-то, чего я пока не знаю
  • другим способом

С размышлениями и вариантами я пошла к своему гуру. И гуру молвил:

«Вспомни, как двигались стулья».

Вариант 2 — вариант: Lerp

Какими способами я только не двигала стулья в Unreal. Но сила мысли и Lerp, кажется, были ответом на мой вопрос.

Lerp – это сленговое в среде программистов обозначение линейной интерполяции.

У вас есть два разных узла A и B. Представьте, что они соединены прямой линией. С шагом Alpha от точки A находится точка A1, которая показывает, насколько далеко по соединительной линии вы находитесь между узлами A и B.

Затем точка A становится точкой A1, и теперь уже новая A1 определяется с тем же шагом Alpha на меньшем отрезке. Так происходит до тех пор, пока вы асимптотически не приблизитесь к точке B, то есть A всегда стремится к B, но никогда не достигает ее фактически.

Пример из прототипа

Текущее значение параметра Эффективность равное о.3 подается на вход A. После действия игрока, по внутренней логике, число меняется и становится равным 0.4. Новое значение параметра Эффективность подается на вход B.

Устанавливаем Alpha, равное 0.1, это 10% от отрезка между A и B.

В итоге Lerp возвращает значения, равные всем промежуточным значениям между A и B c Alpha 0.1 и асимптотически достигает B.

Функция, обновляющая прогресс с помощью Lerp
Блюпринт, использующий функцию

Вот так это выглядит в итоге с Lerp с Alpha=0,1.

Функция, обновляющая прогресс с помощью FInterp To

FInterp To Constant – это тоже интерполяция, но при заданной скорости и времени и до константы. То есть в независимости от того, какое расстояние от текущего положения к заданному предстоит преодолеть, это будет сделано с одинаковой скоростью и за одно и то же время, и гарантировано достигнет заданного значения. В отличие от FInterp To и Lerp, которые всегда приблизительно находятся возле конечной точки.

Пример из прототипа

Текущее значение параметра Эффективность равное о.3 подается на вход Current. После действия игрока по внутренней логике число меняется и становится равным 0.4. Новое значение параметра Эффективность подается на вход Target.

Устанавливаем скорость 0.25, а Delta Time берется из Event Tick, и равна одному тику.

Блюпринт, использующий функцию

Так это выглядит с FInterp To Constant

Привет. Я – гауссовское распределение и я нормальное. Я создаю впечатление естественности :3

PS. Если вы разбираетесь в матане или программировании лучше меня, у вас есть более правильное и четкое объяснение тех тем, которых я сегодня коснулась – пожалуйста, напишите мне. Буду рада узнать что-то новое и дополнить материал.

Спасибо!

Найти меня можно

Telegram channel https://t.me/setvisibility

Discord chat https://discord.gg/8XxUUsc

Twitter https://twitter.com/setvisibility

Vk https://vk.com/setvisibility.gamedev


 
Источник: DTF

Читайте также