EasingCore.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * EasingCore (https://github.com/setchi/EasingCore)
  3. * Copyright (c) 2020 setchi
  4. * Licensed under MIT (https://github.com/setchi/EasingCore/blob/master/LICENSE)
  5. */
  6. using UnityEngine;
  7. namespace EasingCore
  8. {
  9. public enum Ease
  10. {
  11. Linear,
  12. InBack,
  13. InBounce,
  14. InCirc,
  15. InCubic,
  16. InElastic,
  17. InExpo,
  18. InQuad,
  19. InQuart,
  20. InQuint,
  21. InSine,
  22. OutBack,
  23. OutBounce,
  24. OutCirc,
  25. OutCubic,
  26. OutElastic,
  27. OutExpo,
  28. OutQuad,
  29. OutQuart,
  30. OutQuint,
  31. OutSine,
  32. InOutBack,
  33. InOutBounce,
  34. InOutCirc,
  35. InOutCubic,
  36. InOutElastic,
  37. InOutExpo,
  38. InOutQuad,
  39. InOutQuart,
  40. InOutQuint,
  41. InOutSine,
  42. }
  43. public delegate float EasingFunction(float t);
  44. public static class Easing
  45. {
  46. /// <summary>
  47. /// Gets the easing function
  48. /// </summary>
  49. /// <param name="type">Ease type</param>
  50. /// <returns>Easing function</returns>
  51. public static EasingFunction Get(Ease type)
  52. {
  53. switch (type)
  54. {
  55. case Ease.Linear: return linear;
  56. case Ease.InBack: return inBack;
  57. case Ease.InBounce: return inBounce;
  58. case Ease.InCirc: return inCirc;
  59. case Ease.InCubic: return inCubic;
  60. case Ease.InElastic: return inElastic;
  61. case Ease.InExpo: return inExpo;
  62. case Ease.InQuad: return inQuad;
  63. case Ease.InQuart: return inQuart;
  64. case Ease.InQuint: return inQuint;
  65. case Ease.InSine: return inSine;
  66. case Ease.OutBack: return outBack;
  67. case Ease.OutBounce: return outBounce;
  68. case Ease.OutCirc: return outCirc;
  69. case Ease.OutCubic: return outCubic;
  70. case Ease.OutElastic: return outElastic;
  71. case Ease.OutExpo: return outExpo;
  72. case Ease.OutQuad: return outQuad;
  73. case Ease.OutQuart: return outQuart;
  74. case Ease.OutQuint: return outQuint;
  75. case Ease.OutSine: return outSine;
  76. case Ease.InOutBack: return inOutBack;
  77. case Ease.InOutBounce: return inOutBounce;
  78. case Ease.InOutCirc: return inOutCirc;
  79. case Ease.InOutCubic: return inOutCubic;
  80. case Ease.InOutElastic: return inOutElastic;
  81. case Ease.InOutExpo: return inOutExpo;
  82. case Ease.InOutQuad: return inOutQuad;
  83. case Ease.InOutQuart: return inOutQuart;
  84. case Ease.InOutQuint: return inOutQuint;
  85. case Ease.InOutSine: return inOutSine;
  86. default: return linear;
  87. }
  88. float linear(float t) => t;
  89. float inBack(float t) => t * t * t - t * Mathf.Sin(t * Mathf.PI);
  90. float outBack(float t) => 1f - inBack(1f - t);
  91. float inOutBack(float t) =>
  92. t < 0.5f
  93. ? 0.5f * inBack(2f * t)
  94. : 0.5f * outBack(2f * t - 1f) + 0.5f;
  95. float inBounce(float t) => 1f - outBounce(1f - t);
  96. float outBounce(float t) =>
  97. t < 4f / 11.0f ?
  98. (121f * t * t) / 16.0f :
  99. t < 8f / 11.0f ?
  100. (363f / 40.0f * t * t) - (99f / 10.0f * t) + 17f / 5.0f :
  101. t < 9f / 10.0f ?
  102. (4356f / 361.0f * t * t) - (35442f / 1805.0f * t) + 16061f / 1805.0f :
  103. (54f / 5.0f * t * t) - (513f / 25.0f * t) + 268f / 25.0f;
  104. float inOutBounce(float t) =>
  105. t < 0.5f
  106. ? 0.5f * inBounce(2f * t)
  107. : 0.5f * outBounce(2f * t - 1f) + 0.5f;
  108. float inCirc(float t) => 1f - Mathf.Sqrt(1f - (t * t));
  109. float outCirc(float t) => Mathf.Sqrt((2f - t) * t);
  110. float inOutCirc(float t) =>
  111. t < 0.5f
  112. ? 0.5f * (1 - Mathf.Sqrt(1f - 4f * (t * t)))
  113. : 0.5f * (Mathf.Sqrt(-((2f * t) - 3f) * ((2f * t) - 1f)) + 1f);
  114. float inCubic(float t) => t * t * t;
  115. float outCubic(float t) => inCubic(t - 1f) + 1f;
  116. float inOutCubic(float t) =>
  117. t < 0.5f
  118. ? 4f * t * t * t
  119. : 0.5f * inCubic(2f * t - 2f) + 1f;
  120. float inElastic(float t) => Mathf.Sin(13f * (Mathf.PI * 0.5f) * t) * Mathf.Pow(2f, 10f * (t - 1f));
  121. float outElastic(float t) => Mathf.Sin(-13f * (Mathf.PI * 0.5f) * (t + 1)) * Mathf.Pow(2f, -10f * t) + 1f;
  122. float inOutElastic(float t) =>
  123. t < 0.5f
  124. ? 0.5f * Mathf.Sin(13f * (Mathf.PI * 0.5f) * (2f * t)) * Mathf.Pow(2f, 10f * ((2f * t) - 1f))
  125. : 0.5f * (Mathf.Sin(-13f * (Mathf.PI * 0.5f) * ((2f * t - 1f) + 1f)) * Mathf.Pow(2f, -10f * (2f * t - 1f)) + 2f);
  126. float inExpo(float t) => Mathf.Approximately(0.0f, t) ? t : Mathf.Pow(2f, 10f * (t - 1f));
  127. float outExpo(float t) => Mathf.Approximately(1.0f, t) ? t : 1f - Mathf.Pow(2f, -10f * t);
  128. float inOutExpo(float v) =>
  129. Mathf.Approximately(0.0f, v) || Mathf.Approximately(1.0f, v)
  130. ? v
  131. : v < 0.5f
  132. ? 0.5f * Mathf.Pow(2f, (20f * v) - 10f)
  133. : -0.5f * Mathf.Pow(2f, (-20f * v) + 10f) + 1f;
  134. float inQuad(float t) => t * t;
  135. float outQuad(float t) => -t * (t - 2f);
  136. float inOutQuad(float t) =>
  137. t < 0.5f
  138. ? 2f * t * t
  139. : -2f * t * t + 4f * t - 1f;
  140. float inQuart(float t) => t * t * t * t;
  141. float outQuart(float t)
  142. {
  143. var u = t - 1f;
  144. return u * u * u * (1f - t) + 1f;
  145. }
  146. float inOutQuart(float t) =>
  147. t < 0.5f
  148. ? 8f * inQuart(t)
  149. : -8f * inQuart(t - 1f) + 1f;
  150. float inQuint(float t) => t * t * t * t * t;
  151. float outQuint(float t) => inQuint(t - 1f) + 1f;
  152. float inOutQuint(float t) =>
  153. t < 0.5f
  154. ? 16f * inQuint(t)
  155. : 0.5f * inQuint(2f * t - 2f) + 1f;
  156. float inSine(float t) => Mathf.Sin((t - 1f) * (Mathf.PI * 0.5f)) + 1f;
  157. float outSine(float t) => Mathf.Sin(t * (Mathf.PI * 0.5f));
  158. float inOutSine(float t) => 0.5f * (1f - Mathf.Cos(t * Mathf.PI));
  159. }
  160. }
  161. }