Dropdown.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. namespace Devdog.SciFiDesign.UI
  7. {
  8. [AddComponentMenu("UI/Custom/Dropdown", 35)]
  9. public class Dropdown : UnityEngine.UI.Dropdown
  10. {
  11. public Sprite activeSprite;
  12. public Sprite inActiveSprite;
  13. public Image backgroundImage;
  14. public float slideSpeed = 5f;
  15. public AnimationCurve animationCurve = AnimationCurve.Linear(0f, 1f, 1f, 0f);
  16. private Vector2 _startSize;
  17. private RectTransform _rectTransform;
  18. private Color _normalStartColor;
  19. private Color _imageStartColor;
  20. protected override void Start()
  21. {
  22. base.Start();
  23. _rectTransform = GetComponent<RectTransform>();
  24. _normalStartColor = colors.normalColor;
  25. _startSize = _rectTransform.sizeDelta;
  26. _imageStartColor = backgroundImage.color;
  27. }
  28. protected override GameObject CreateBlocker(Canvas rootCanvas)
  29. {
  30. var obj = base.CreateBlocker(rootCanvas);
  31. StartCoroutine(_GrowToSize(_rectTransform));
  32. backgroundImage.sprite = activeSprite;
  33. var c = colors;
  34. c.normalColor = colors.pressedColor;
  35. backgroundImage.color = new Color(backgroundImage.color.r, backgroundImage.color.g, backgroundImage.color.b, 1f);
  36. colors = c;
  37. return obj;
  38. }
  39. protected override void DestroyBlocker(GameObject blocker)
  40. {
  41. base.DestroyBlocker(blocker);
  42. StartCoroutine(_ShrinkToSize(_rectTransform, _startSize));
  43. var c = colors;
  44. c.normalColor = _normalStartColor;
  45. colors = c;
  46. backgroundImage.color = _imageStartColor;
  47. backgroundImage.sprite = inActiveSprite;
  48. }
  49. private IEnumerator _GrowToSize(RectTransform rectTransform)
  50. {
  51. LayoutRebuilder.ForceRebuildLayoutImmediate(backgroundImage.rectTransform);
  52. var toSize = new Vector2(LayoutUtility.GetPreferredWidth(backgroundImage.rectTransform), LayoutUtility.GetPreferredHeight(backgroundImage.rectTransform));
  53. float time = 0f;
  54. var fromSize = rectTransform.sizeDelta;
  55. while (true)
  56. {
  57. var newSize = rectTransform.sizeDelta;
  58. newSize.x = Mathf.Lerp(fromSize.x, toSize.x, animationCurve.Evaluate(time)); // animationCurve.Evaluate(time)
  59. newSize.y = Mathf.Lerp(fromSize.y, toSize.y, animationCurve.Evaluate(time));
  60. rectTransform.sizeDelta = newSize;
  61. if (newSize.x >= toSize.x && newSize.y >= toSize.y)
  62. {
  63. break;
  64. }
  65. time += Time.deltaTime * slideSpeed;
  66. yield return null;
  67. }
  68. }
  69. private IEnumerator _ShrinkToSize(RectTransform rectTransform, Vector2 toSize)
  70. {
  71. float time = 0f;
  72. var fromSize = rectTransform.sizeDelta;
  73. while (true)
  74. {
  75. var newSize = rectTransform.sizeDelta;
  76. newSize.x = Mathf.Lerp(fromSize.x, toSize.x, animationCurve.Evaluate(time));
  77. newSize.y = Mathf.Lerp(fromSize.y, toSize.y, animationCurve.Evaluate(time));
  78. rectTransform.sizeDelta = newSize;
  79. if (newSize.x <= toSize.x && newSize.y <= toSize.y)
  80. {
  81. break;
  82. }
  83. time += Time.deltaTime * slideSpeed;
  84. yield return null;
  85. }
  86. }
  87. }
  88. }