Easings - Набор функций сглаживания

Когда требуется реализовать какие-то простые анимации, то первым делом прибегают к готовым пакетам, реализующим tween-анимации с поддержкой определенного набора функций сглаживания (easings). Но что, если нужно более точно контролировать анимацию программно как часть игромеханики и при этом сохранить поддержку функций сглаживания?

Можно попытаться выдернуть математику из готового пакета, можно самостоятельно повторить, опираясь на примеры с easings.net

Пакет Leopotam.Easings поддерживает набор следующих функций сглаживания:

  • Linear
  • QuadIn
  • QuadOut
  • QuadInOut
  • CubicIn
  • CubicOut
  • CubicInOut
  • QuartIn
  • QuartOut
  • QuartInOut
  • QuintIn
  • QuintOut
  • QuintInOut
  • SineIn
  • SineOut
  • SineInOut
  • BounceIn
  • BounceOut
  • BounceInOut
  • BackIn
  • BackOut
  • BackInOut
  • ElasticIn
  • ElasticOut
  • ElasticInOut

Каждый вариант сглаживания доступен через перечисление, которое можно сохранить в поле/переменную для дальнейшего использования:

1
2
Ease e1 = Ease.Linear;
Ease e2 = Ease.ElasticIn;

Входящие данные требуется нормализовывать в диапазон [0;1] перед использованием расчета сглаживания - в данном пакете поддерживаются 4 вида нормализации (на примере Ease.Linear):

  • Raw - вычисление без изменения входящего параметра, следует использовать только в качестве оптимизации и если известно, что значение параметра точно находится в [0;1]:
    1
    2
    3
    4
    5
    6
    float r1 = Ease.Linear.Raw (-0.5f);
    float r2 = Ease.Linear.Raw (0.5f);
    float r3 = Ease.Linear.Raw (1.5f);
    // r1 = -0.5f;
    // r2 = 0.5f;
    // r3 = 1.5f;
  • Clamp - вычисление с обрезанием входящего параметра в [0;1]:
    1
    2
    3
    4
    5
    6
    float r1 = Ease.Linear.Clamp (-0.5f);
    float r2 = Ease.Linear.Clamp (0.5f);
    float r3 = Ease.Linear.Clamp (1.5f);
    // r1 = 0f;
    // r2 = 0.5f;
    // r3 = 1f;
  • Repeat - вычисление с повторением (отбрасыванием целой части) входящего параметра в [0;1):
    1
    2
    3
    4
    5
    6
    float r1 = Ease.Linear.Repeat (-0.5f);
    float r2 = Ease.Linear.Repeat (0.1f);
    float r3 = Ease.Linear.Repeat (1.4f);
    // r1 = 0.5f;
    // r2 = 0.1f;
    // r3 = 0.4f;
  • PingPong - вычисление с повторением (нарастание с 0 до 1 и снижение с 1 до 2 к начальному значению) входящего параметра в [0;1):
    1
    2
    3
    4
    5
    6
    7
    8
    float r1 = Ease.Linear.PingPong (0.1f);
    float r2 = Ease.Linear.PingPong (1f);
    float r3 = Ease.Linear.PingPong (1.5f);
    float r4 = Ease.Linear.PingPong (2f);
    // r1 = 0.1f;
    // r2 = 1.0f;
    // r3 = 0.5f;
    // r4 = 0.0f;
Актуальные версии пакетов доступны в закрытом discord-сервере для vk/boosty-подписчиков.
Оформить подписку можно здесь: