EaseManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. using UnityEngine;
  2. using System.Collections;
  3. /// <summary>
  4. /// Ease type.
  5. /// </summary>
  6. namespace CommonUnity3D.UGUIAction
  7. {
  8. public enum EaseType{
  9. none,
  10. easeInQuad,
  11. easeOutQuad,
  12. easeInOutQuad,
  13. easeInCubic,
  14. easeOutCubic,
  15. easeInOutCubic,
  16. easeInQuart,
  17. easeOutQuart,
  18. easeInOutQuart,
  19. easeInQuint,
  20. easeOutQuint,
  21. easeInOutQuint,
  22. easeInSine,
  23. easeOutSine,
  24. easeInOutSine,
  25. easeInExpo,
  26. easeOutExpo,
  27. easeInOutExpo,
  28. easeInCirc,
  29. easeOutCirc,
  30. easeInOutCirc,
  31. linear,
  32. spring,
  33. /* GFX47 MOD START */
  34. //bounce,
  35. easeInBounce,
  36. easeOutBounce,
  37. easeInOutBounce,
  38. /* GFX47 MOD END */
  39. easeInBack,
  40. easeOutBack,
  41. easeInOutBack,
  42. /* GFX47 MOD START */
  43. //elastic,
  44. easeInElastic,
  45. easeOutElastic,
  46. easeInOutElastic,
  47. /* GFX47 MOD END */
  48. punch
  49. }
  50. /// <summary>
  51. /// Loop style.
  52. /// </summary>
  53. public enum LoopStyle {
  54. Once,
  55. Loop,
  56. PingPong
  57. }
  58. /// <summary>
  59. /// Ease manager.
  60. /// </summary>
  61. public class EaseManager {
  62. public delegate float EaseDelegate(float start, float end, float t);
  63. #region ease function
  64. private static float linear(float start, float end, float value){
  65. return Mathf.Lerp(start, end, value);
  66. }
  67. private static float clerp(float start, float end, float value){
  68. float min = 0.0f;
  69. float max = 360.0f;
  70. float half = Mathf.Abs((max - min) / 2.0f);
  71. float retval = 0.0f;
  72. float diff = 0.0f;
  73. if ((end - start) < -half){
  74. diff = ((max - start) + end) * value;
  75. retval = start + diff;
  76. }else if ((end - start) > half){
  77. diff = -((max - end) + start) * value;
  78. retval = start + diff;
  79. }else retval = start + (end - start) * value;
  80. return retval;
  81. }
  82. private static float spring(float start, float end, float value){
  83. value = Mathf.Clamp01(value);
  84. value = (Mathf.Sin(value * Mathf.PI * (0.2f + 2.5f * value * value * value)) * Mathf.Pow(1f - value, 2.2f) + value) * (1f + (1.2f * (1f - value)));
  85. return start + (end - start) * value;
  86. }
  87. private static float easeInQuad(float start, float end, float value){
  88. end -= start;
  89. return end * value * value + start;
  90. }
  91. private static float easeOutQuad(float start, float end, float value){
  92. end -= start;
  93. return -end * value * (value - 2) + start;
  94. }
  95. private static float easeInOutQuad(float start, float end, float value){
  96. value /= .5f;
  97. end -= start;
  98. if (value < 1) return end / 2 * value * value + start;
  99. value--;
  100. return -end / 2 * (value * (value - 2) - 1) + start;
  101. }
  102. private static float easeInCubic(float start, float end, float value){
  103. end -= start;
  104. return end * value * value * value + start;
  105. }
  106. private static float easeOutCubic(float start, float end, float value){
  107. value--;
  108. end -= start;
  109. return end * (value * value * value + 1) + start;
  110. }
  111. private static float easeInOutCubic(float start, float end, float value){
  112. value /= .5f;
  113. end -= start;
  114. if (value < 1) return end / 2 * value * value * value + start;
  115. value -= 2;
  116. return end / 2 * (value * value * value + 2) + start;
  117. }
  118. private static float easeInQuart(float start, float end, float value){
  119. end -= start;
  120. return end * value * value * value * value + start;
  121. }
  122. private static float easeOutQuart(float start, float end, float value){
  123. value--;
  124. end -= start;
  125. return -end * (value * value * value * value - 1) + start;
  126. }
  127. private static float easeInOutQuart(float start, float end, float value){
  128. value /= .5f;
  129. end -= start;
  130. if (value < 1) return end / 2 * value * value * value * value + start;
  131. value -= 2;
  132. return -end / 2 * (value * value * value * value - 2) + start;
  133. }
  134. private static float easeInQuint(float start, float end, float value){
  135. end -= start;
  136. return end * value * value * value * value * value + start;
  137. }
  138. private static float easeOutQuint(float start, float end, float value){
  139. value--;
  140. end -= start;
  141. return end * (value * value * value * value * value + 1) + start;
  142. }
  143. private static float easeInOutQuint(float start, float end, float value){
  144. value /= .5f;
  145. end -= start;
  146. if (value < 1) return end / 2 * value * value * value * value * value + start;
  147. value -= 2;
  148. return end / 2 * (value * value * value * value * value + 2) + start;
  149. }
  150. private static float easeInSine(float start, float end, float value){
  151. end -= start;
  152. return -end * Mathf.Cos(value / 1 * (Mathf.PI / 2)) + end + start;
  153. }
  154. private static float easeOutSine(float start, float end, float value){
  155. end -= start;
  156. return end * Mathf.Sin(value / 1 * (Mathf.PI / 2)) + start;
  157. }
  158. private static float easeInOutSine(float start, float end, float value){
  159. end -= start;
  160. return -end / 2 * (Mathf.Cos(Mathf.PI * value / 1) - 1) + start;
  161. }
  162. private static float easeInExpo(float start, float end, float value){
  163. end -= start;
  164. return end * Mathf.Pow(2, 10 * (value / 1 - 1)) + start;
  165. }
  166. private static float easeOutExpo(float start, float end, float value){
  167. end -= start;
  168. return end * (-Mathf.Pow(2, -10 * value / 1) + 1) + start;
  169. }
  170. private static float easeInOutExpo(float start, float end, float value){
  171. value /= .5f;
  172. end -= start;
  173. if (value < 1) return end / 2 * Mathf.Pow(2, 10 * (value - 1)) + start;
  174. value--;
  175. return end / 2 * (-Mathf.Pow(2, -10 * value) + 2) + start;
  176. }
  177. private static float easeInCirc(float start, float end, float value){
  178. end -= start;
  179. return -end * (Mathf.Sqrt(1 - value * value) - 1) + start;
  180. }
  181. private static float easeOutCirc(float start, float end, float value){
  182. value--;
  183. end -= start;
  184. return end * Mathf.Sqrt(1 - value * value) + start;
  185. }
  186. private static float easeInOutCirc(float start, float end, float value){
  187. value /= .5f;
  188. end -= start;
  189. if (value < 1) return -end / 2 * (Mathf.Sqrt(1 - value * value) - 1) + start;
  190. value -= 2;
  191. return end / 2 * (Mathf.Sqrt(1 - value * value) + 1) + start;
  192. }
  193. /* GFX47 MOD START */
  194. private static float easeInBounce(float start, float end, float value){
  195. end -= start;
  196. float d = 1f;
  197. return end - easeOutBounce(0, end, d-value) + start;
  198. }
  199. /* GFX47 MOD END */
  200. /* GFX47 MOD START */
  201. //private static float bounce(float start, float end, float value){
  202. private static float easeOutBounce(float start, float end, float value){
  203. value /= 1f;
  204. end -= start;
  205. if (value < (1 / 2.75f)){
  206. return end * (7.5625f * value * value) + start;
  207. }else if (value < (2 / 2.75f)){
  208. value -= (1.5f / 2.75f);
  209. return end * (7.5625f * (value) * value + .75f) + start;
  210. }else if (value < (2.5 / 2.75)){
  211. value -= (2.25f / 2.75f);
  212. return end * (7.5625f * (value) * value + .9375f) + start;
  213. }else{
  214. value -= (2.625f / 2.75f);
  215. return end * (7.5625f * (value) * value + .984375f) + start;
  216. }
  217. }
  218. /* GFX47 MOD END */
  219. /* GFX47 MOD START */
  220. private static float easeInOutBounce(float start, float end, float value){
  221. end -= start;
  222. float d = 1f;
  223. if (value < d/2) return easeInBounce(0, end, value*2) * 0.5f + start;
  224. else return easeOutBounce(0, end, value*2-d) * 0.5f + end*0.5f + start;
  225. }
  226. /* GFX47 MOD END */
  227. private static float easeInBack(float start, float end, float value){
  228. end -= start;
  229. value /= 1;
  230. float s = 1.70158f;
  231. return end * (value) * value * ((s + 1) * value - s) + start;
  232. }
  233. private static float easeOutBack(float start, float end, float value){
  234. float s = 1.70158f;
  235. end -= start;
  236. value = (value / 1) - 1;
  237. return end * ((value) * value * ((s + 1) * value + s) + 1) + start;
  238. }
  239. private static float easeInOutBack(float start, float end, float value){
  240. float s = 1.70158f;
  241. end -= start;
  242. value /= .5f;
  243. if ((value) < 1){
  244. s *= (1.525f);
  245. return end / 2 * (value * value * (((s) + 1) * value - s)) + start;
  246. }
  247. value -= 2;
  248. s *= (1.525f);
  249. return end / 2 * ((value) * value * (((s) + 1) * value + s) + 2) + start;
  250. }
  251. private static float punch(float amplitude, float value){
  252. float s = 9;
  253. if (value == 0){
  254. return 0;
  255. }
  256. if (value == 1){
  257. return 0;
  258. }
  259. float period = 1 * 0.3f;
  260. s = period / (2 * Mathf.PI) * Mathf.Asin(0);
  261. return (amplitude * Mathf.Pow(2, -10 * value) * Mathf.Sin((value * 1 - s) * (2 * Mathf.PI) / period));
  262. }
  263. /* GFX47 MOD START */
  264. private static float easeInElastic(float start, float end, float value){
  265. end -= start;
  266. float d = 1f;
  267. float p = d * .3f;
  268. float s = 0;
  269. float a = 0;
  270. if (value == 0) return start;
  271. if ((value /= d) == 1) return start + end;
  272. if (a == 0f || a < Mathf.Abs(end)){
  273. a = end;
  274. s = p / 4;
  275. }else{
  276. s = p / (2 * Mathf.PI) * Mathf.Asin(end / a);
  277. }
  278. return -(a * Mathf.Pow(2, 10 * (value-=1)) * Mathf.Sin((value * d - s) * (2 * Mathf.PI) / p)) + start;
  279. }
  280. /* GFX47 MOD END */
  281. /* GFX47 MOD START */
  282. //private static float elastic(float start, float end, float value){
  283. private static float easeOutElastic(float start, float end, float value){
  284. /* GFX47 MOD END */
  285. //Thank you to rafael.marteleto for fixing this as a port over from Pedro's UnityTween
  286. end -= start;
  287. float d = 1f;
  288. float p = d * .3f;
  289. float s = 0;
  290. float a = 0;
  291. if (value == 0) return start;
  292. if ((value /= d) == 1) return start + end;
  293. if (a == 0f || a < Mathf.Abs(end)){
  294. a = end;
  295. s = p / 4;
  296. }else{
  297. s = p / (2 * Mathf.PI) * Mathf.Asin(end / a);
  298. }
  299. return (a * Mathf.Pow(2, -10 * value) * Mathf.Sin((value * d - s) * (2 * Mathf.PI) / p) + end + start);
  300. }
  301. /* GFX47 MOD START */
  302. private static float easeInOutElastic(float start, float end, float value){
  303. end -= start;
  304. float d = 1f;
  305. float p = d * .3f;
  306. float s = 0;
  307. float a = 0;
  308. if (value == 0) return start;
  309. if ((value /= d/2) == 2) return start + end;
  310. if (a == 0f || a < Mathf.Abs(end)){
  311. a = end;
  312. s = p / 4;
  313. }else{
  314. s = p / (2 * Mathf.PI) * Mathf.Asin(end / a);
  315. }
  316. if (value < 1) return -0.5f * (a * Mathf.Pow(2, 10 * (value-=1)) * Mathf.Sin((value * d - s) * (2 * Mathf.PI) / p)) + start;
  317. return a * Mathf.Pow(2, -10 * (value-=1)) * Mathf.Sin((value * d - s) * (2 * Mathf.PI) / p) * 0.5f + end + start;
  318. }
  319. /* GFX47 MOD END */
  320. public static float EasingFromType(float start, float end, float t, EaseType type){
  321. switch (type){
  322. case EaseType.easeInQuad:
  323. return easeInQuad(start, end, t);
  324. case EaseType.easeOutQuad:
  325. return easeOutQuad(start, end, t);
  326. case EaseType.easeInOutQuad:
  327. return easeInOutQuad(start, end, t);
  328. case EaseType.easeInCubic:
  329. return easeInCubic(start, end, t);
  330. case EaseType.easeOutCubic:
  331. return easeOutCubic(start, end, t);
  332. case EaseType.easeInOutCubic:
  333. return easeInOutCubic(start, end, t);
  334. case EaseType.easeInQuart:
  335. return easeInQuart(start, end, t);
  336. case EaseType.easeOutQuart:
  337. return easeOutQuart(start, end, t);
  338. case EaseType.easeInOutQuart:
  339. return easeInOutQuart(start, end, t);
  340. case EaseType.easeInQuint:
  341. return easeInQuint(start, end, t);
  342. case EaseType.easeOutQuint:
  343. return easeOutQuint(start, end, t);
  344. case EaseType.easeInOutQuint:
  345. return easeInOutQuint(start, end, t);
  346. case EaseType.easeInSine:
  347. return easeInSine(start, end, t);
  348. case EaseType.easeOutSine:
  349. return easeOutSine(start, end, t);
  350. case EaseType.easeInOutSine:
  351. return easeInOutSine(start, end, t);
  352. case EaseType.easeInExpo:
  353. return easeInExpo(start, end, t);
  354. case EaseType.easeOutExpo:
  355. return easeOutExpo(start, end, t);
  356. case EaseType.easeInOutExpo:
  357. return easeInOutExpo(start, end, t);
  358. case EaseType.easeInCirc:
  359. return easeInCirc(start, end, t);
  360. case EaseType.easeOutCirc:
  361. return easeOutCirc(start, end, t);
  362. case EaseType.easeInOutCirc:
  363. return easeInOutCirc(start, end, t);
  364. case EaseType.linear:
  365. return linear(start, end, t);
  366. case EaseType.spring:
  367. return spring(start, end, t);
  368. /* GFX47 MOD START */
  369. /*case EaseType.bounce:
  370. return bounce(start, end, t);
  371. */
  372. case EaseType.easeInBounce:
  373. return easeInBounce(start, end, t);
  374. case EaseType.easeOutBounce:
  375. return easeOutBounce(start, end, t);
  376. case EaseType.easeInOutBounce:
  377. return easeInOutBounce(start, end, t);
  378. /* GFX47 MOD END */
  379. case EaseType.easeInBack:
  380. return easeInBack(start, end, t);
  381. case EaseType.easeOutBack:
  382. return easeOutBack(start, end, t);
  383. case EaseType.easeInOutBack:
  384. return easeInOutBack(start, end, t);
  385. /* GFX47 MOD START */
  386. /*case EaseType.elastic:
  387. return elastic(start, end, t);
  388. */
  389. case EaseType.easeInElastic:
  390. return easeInElastic(start, end, t);
  391. case EaseType.easeOutElastic:
  392. return easeOutElastic(start, end, t);
  393. case EaseType.easeInOutElastic:
  394. return easeInOutElastic(start, end, t);
  395. /* GFX47 MOD END */
  396. }
  397. return linear(start, end, t);
  398. }
  399. #endregion
  400. }
  401. }