SRMath.Tweening.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using System;
  2. using UnityEngine;
  3. public static partial class SRMath
  4. {
  5. public enum EaseType
  6. {
  7. Linear,
  8. QuadEaseOut,
  9. QuadEaseIn,
  10. QuadEaseInOut,
  11. QuadEaseOutIn,
  12. ExpoEaseOut,
  13. ExpoEaseIn,
  14. ExpoEaseInOut,
  15. ExpoEaseOutIn,
  16. CubicEaseOut,
  17. CubicEaseIn,
  18. CubicEaseInOut,
  19. CubicEaseOutIn,
  20. QuartEaseOut,
  21. QuartEaseIn,
  22. QuartEaseInOut,
  23. QuartEaseOutIn,
  24. QuintEaseOut,
  25. QuintEaseIn,
  26. QuintEaseInOut,
  27. QuintEaseOutIn,
  28. CircEaseOut,
  29. CircEaseIn,
  30. CircEaseInOut,
  31. CircEaseOutIn,
  32. SineEaseOut,
  33. SineEaseIn,
  34. SineEaseInOut,
  35. SineEaseOutIn,
  36. ElasticEaseOut,
  37. ElasticEaseIn,
  38. ElasticEaseInOut,
  39. ElasticEaseOutIn,
  40. BounceEaseOut,
  41. BounceEaseIn,
  42. BounceEaseInOut,
  43. BounceEaseOutIn,
  44. BackEaseOut,
  45. BackEaseIn,
  46. BackEaseInOut,
  47. BackEaseOutIn
  48. }
  49. public static float Ease(float from, float to, float t, EaseType type)
  50. {
  51. switch (type)
  52. {
  53. case EaseType.Linear:
  54. return TweenFunctions.Linear(t, from, to, 1f);
  55. case EaseType.QuadEaseOut:
  56. return TweenFunctions.QuadEaseOut(t, from, to, 1f);
  57. case EaseType.QuadEaseIn:
  58. return TweenFunctions.QuadEaseIn(t, from, to, 1f);
  59. case EaseType.QuadEaseInOut:
  60. return TweenFunctions.QuadEaseInOut(t, from, to, 1f);
  61. case EaseType.QuadEaseOutIn:
  62. return TweenFunctions.QuadEaseOutIn(t, from, to, 1f);
  63. case EaseType.ExpoEaseOut:
  64. return TweenFunctions.ExpoEaseOut(t, from, to, 1f);
  65. case EaseType.ExpoEaseIn:
  66. return TweenFunctions.ExpoEaseIn(t, from, to, 1f);
  67. case EaseType.ExpoEaseInOut:
  68. return TweenFunctions.ExpoEaseInOut(t, from, to, 1f);
  69. case EaseType.ExpoEaseOutIn:
  70. return TweenFunctions.ExpoEaseOutIn(t, from, to, 1f);
  71. case EaseType.CubicEaseOut:
  72. return TweenFunctions.CubicEaseOut(t, from, to, 1f);
  73. case EaseType.CubicEaseIn:
  74. return TweenFunctions.CubicEaseIn(t, from, to, 1f);
  75. case EaseType.CubicEaseInOut:
  76. return TweenFunctions.CubicEaseInOut(t, from, to, 1f);
  77. case EaseType.CubicEaseOutIn:
  78. return TweenFunctions.CubicEaseOutIn(t, from, to, 1f);
  79. case EaseType.QuartEaseOut:
  80. return TweenFunctions.QuartEaseOut(t, from, to, 1f);
  81. case EaseType.QuartEaseIn:
  82. return TweenFunctions.QuartEaseIn(t, from, to, 1f);
  83. case EaseType.QuartEaseInOut:
  84. return TweenFunctions.QuartEaseInOut(t, from, to, 1f);
  85. case EaseType.QuartEaseOutIn:
  86. return TweenFunctions.QuartEaseOutIn(t, from, to, 1f);
  87. case EaseType.QuintEaseOut:
  88. return TweenFunctions.QuintEaseOut(t, from, to, 1f);
  89. case EaseType.QuintEaseIn:
  90. return TweenFunctions.QuintEaseIn(t, from, to, 1f);
  91. case EaseType.QuintEaseInOut:
  92. return TweenFunctions.QuintEaseInOut(t, from, to, 1f);
  93. case EaseType.QuintEaseOutIn:
  94. return TweenFunctions.QuintEaseOutIn(t, from, to, 1f);
  95. case EaseType.CircEaseOut:
  96. return TweenFunctions.CircEaseOut(t, from, to, 1f);
  97. case EaseType.CircEaseIn:
  98. return TweenFunctions.CircEaseIn(t, from, to, 1f);
  99. case EaseType.CircEaseInOut:
  100. return TweenFunctions.CircEaseInOut(t, from, to, 1f);
  101. case EaseType.CircEaseOutIn:
  102. return TweenFunctions.CircEaseOutIn(t, from, to, 1f);
  103. case EaseType.SineEaseOut:
  104. return TweenFunctions.SineEaseOut(t, from, to, 1f);
  105. case EaseType.SineEaseIn:
  106. return TweenFunctions.SineEaseIn(t, from, to, 1f);
  107. case EaseType.SineEaseInOut:
  108. return TweenFunctions.SineEaseInOut(t, from, to, 1f);
  109. case EaseType.SineEaseOutIn:
  110. return TweenFunctions.SineEaseOutIn(t, from, to, 1f);
  111. case EaseType.ElasticEaseOut:
  112. return TweenFunctions.ElasticEaseOut(t, from, to, 1f);
  113. case EaseType.ElasticEaseIn:
  114. return TweenFunctions.ElasticEaseIn(t, from, to, 1f);
  115. case EaseType.ElasticEaseInOut:
  116. return TweenFunctions.ElasticEaseInOut(t, from, to, 1f);
  117. case EaseType.ElasticEaseOutIn:
  118. return TweenFunctions.ElasticEaseOutIn(t, from, to, 1f);
  119. case EaseType.BounceEaseOut:
  120. return TweenFunctions.BounceEaseOut(t, from, to, 1f);
  121. case EaseType.BounceEaseIn:
  122. return TweenFunctions.BounceEaseIn(t, from, to, 1f);
  123. case EaseType.BounceEaseInOut:
  124. return TweenFunctions.BounceEaseInOut(t, from, to, 1f);
  125. case EaseType.BounceEaseOutIn:
  126. return TweenFunctions.BounceEaseOutIn(t, from, to, 1f);
  127. case EaseType.BackEaseOut:
  128. return TweenFunctions.BackEaseOut(t, from, to, 1f);
  129. case EaseType.BackEaseIn:
  130. return TweenFunctions.BackEaseIn(t, from, to, 1f);
  131. case EaseType.BackEaseInOut:
  132. return TweenFunctions.BackEaseInOut(t, from, to, 1f);
  133. case EaseType.BackEaseOutIn:
  134. return TweenFunctions.BackEaseOutIn(t, from, to, 1f);
  135. default:
  136. throw new ArgumentOutOfRangeException("type");
  137. }
  138. }
  139. /// <summary>
  140. /// Calculate a framerate-independent value to lerp by
  141. /// </summary>
  142. /// <param name="strength"></param>
  143. /// <param name="deltaTime"></param>
  144. /// <returns></returns>
  145. public static float SpringLerp(float strength, float deltaTime)
  146. {
  147. var ms = Mathf.RoundToInt(deltaTime*1000f);
  148. var step = 0.001f*strength;
  149. var from = 0f;
  150. var to = 1f;
  151. for (var i = 0; i < ms; i++)
  152. {
  153. from = Mathf.Lerp(from, to, step);
  154. }
  155. return from;
  156. }
  157. /// <summary>
  158. /// A frame-rate independent way of doing Mathf.Lerp(from, to, Time.deltaTime * strength). Based on NGUIMath.SpringLerp
  159. /// </summary>
  160. /// <param name="from">Starting Value</param>
  161. /// <param name="to">End Value</param>
  162. /// <param name="strength">How fast the spring will complete</param>
  163. /// <param name="deltaTime">Pass in Time.deltaTime or RealTime.deltaTime</param>
  164. /// <returns>Interpolated value</returns>
  165. public static float SpringLerp(float from, float to, float strength, float deltaTime)
  166. {
  167. return Mathf.Lerp(from, to, SpringLerp(strength, deltaTime));
  168. }
  169. public static Vector3 SpringLerp(Vector3 from, Vector3 to, float strength, float deltaTime)
  170. {
  171. return Vector3.Lerp(from, to, SpringLerp(strength, deltaTime));
  172. }
  173. public static Quaternion SpringLerp(Quaternion from, Quaternion to, float strength, float deltaTime)
  174. {
  175. return Quaternion.Slerp(from, to, SpringLerp(strength, deltaTime));
  176. }
  177. /// <summary>
  178. /// Smoothly clamp value between 0 and max, smoothing between min and max
  179. /// </summary>
  180. /// <param name="value"></param>
  181. /// <param name="min"></param>
  182. /// <param name="max"></param>
  183. /// <param name="easeType"></param>
  184. /// <returns></returns>
  185. public static float SmoothClamp(float value, float min, float max, float scrollMax,
  186. EaseType easeType = EaseType.ExpoEaseOut)
  187. {
  188. if (value < min)
  189. {
  190. return value;
  191. }
  192. var p = Mathf.Clamp01((value - min)/(scrollMax - min));
  193. Debug.Log(p);
  194. return Mathf.Clamp(min + Mathf.Lerp(value - min, max, Ease(0, 1f, p, easeType)), 0, max);
  195. }
  196. }