您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

136 行
3.3 KiB

  1. using System;
  2. using Tweening;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. using UnityEngine.UI;
  6. namespace CIG
  7. {
  8. public class ScrollbarTweener : MonoBehaviour
  9. {
  10. private void Start()
  11. {
  12. this._scrollRect.onValueChanged.AddListener(new UnityAction<Vector2>(this.OnScrollRectValueChanged));
  13. this._tweener.FinishedPlaying += this.OnTweenerFinishedPlaying;
  14. }
  15. private void OnEnable()
  16. {
  17. if (this._startHidden)
  18. {
  19. this._canvasGroup.alpha = 0f;
  20. this._canvasGroup.interactable = false;
  21. }
  22. else
  23. {
  24. this.OnScrollRectValueChanged(this._scrollRect.normalizedPosition);
  25. }
  26. }
  27. private void LateUpdate()
  28. {
  29. this._scrollBar.size = Mathf.Clamp(this._scrollBar.size, this._minHandleSize, this._maxHandleSize);
  30. }
  31. private void OnDestroy()
  32. {
  33. this._scrollRect.onValueChanged.RemoveListener(new UnityAction<Vector2>(this.OnScrollRectValueChanged));
  34. this._tweener.FinishedPlaying -= this.OnTweenerFinishedPlaying;
  35. }
  36. public void OnScrollRectValueChanged(Vector2 scrollPosition)
  37. {
  38. if (this._tweener.IsPlaying)
  39. {
  40. this._tweener.Stop();
  41. }
  42. this._tweener.Reset(false);
  43. this._canvasGroup.interactable = true;
  44. this._updatingScrollBar = true;
  45. switch (this._scrollBar.direction)
  46. {
  47. case Scrollbar.Direction.LeftToRight:
  48. case Scrollbar.Direction.RightToLeft:
  49. {
  50. this._scrollBar.value = scrollPosition.x;
  51. float num = this._scrollRect.content.rect.width;
  52. float num2 = this._scrollRect.viewport.rect.width;
  53. break;
  54. }
  55. case Scrollbar.Direction.BottomToTop:
  56. case Scrollbar.Direction.TopToBottom:
  57. {
  58. this._scrollBar.value = scrollPosition.y;
  59. float num = this._scrollRect.content.rect.height;
  60. float num2 = this._scrollRect.viewport.rect.height;
  61. break;
  62. }
  63. default:
  64. UnityEngine.Debug.LogWarningFormat("Missing direction: '{0}'", new object[]
  65. {
  66. this._scrollBar.direction
  67. });
  68. break;
  69. }
  70. this._scrollBar.size = Mathf.Clamp(this._scrollBar.size, this._minHandleSize, this._maxHandleSize);
  71. this._updatingScrollBar = false;
  72. this._tweener.Play();
  73. }
  74. public void OnScrollBarValueChanged(float value)
  75. {
  76. if (this._updatingScrollBar)
  77. {
  78. return;
  79. }
  80. switch (this._scrollBar.direction)
  81. {
  82. case Scrollbar.Direction.LeftToRight:
  83. case Scrollbar.Direction.RightToLeft:
  84. this._scrollRect.horizontalNormalizedPosition = value;
  85. break;
  86. case Scrollbar.Direction.BottomToTop:
  87. case Scrollbar.Direction.TopToBottom:
  88. this._scrollRect.verticalNormalizedPosition = value;
  89. break;
  90. default:
  91. UnityEngine.Debug.LogWarningFormat("Missing direction: '{0}'", new object[]
  92. {
  93. this._scrollBar.direction
  94. });
  95. break;
  96. }
  97. }
  98. private void OnTweenerFinishedPlaying(Tweener tweener)
  99. {
  100. this._canvasGroup.interactable = false;
  101. }
  102. [SerializeField]
  103. private ScrollRect _scrollRect;
  104. [SerializeField]
  105. private Scrollbar _scrollBar;
  106. [SerializeField]
  107. private Tweener _tweener;
  108. [SerializeField]
  109. [Range(0f, 1f)]
  110. private float _minHandleSize;
  111. [SerializeField]
  112. [Range(0f, 1f)]
  113. private float _maxHandleSize = 1f;
  114. [SerializeField]
  115. private CanvasGroup _canvasGroup;
  116. [SerializeField]
  117. private bool _startHidden = true;
  118. private bool _updatingScrollBar;
  119. }
  120. }