ScrollToBottomBehaviour.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. namespace SRF.UI
  2. {
  3. using System;
  4. using Internal;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. [ExecuteInEditMode]
  8. [RequireComponent(typeof(RectTransform))]
  9. [AddComponentMenu(ComponentMenuPaths.ScrollToBottom)]
  10. public class ScrollToBottomBehaviour : MonoBehaviour
  11. {
  12. #pragma warning disable 649
  13. [SerializeField]
  14. private ScrollRect _scrollRect;
  15. [SerializeField]
  16. private CanvasGroup _canvasGroup;
  17. [SerializeField]
  18. private bool _scrollToTop;
  19. #pragma warning restore 649
  20. public void Start()
  21. {
  22. if (_scrollRect == null)
  23. {
  24. Debug.LogError("[ScrollToBottomBehaviour] ScrollRect not set");
  25. return;
  26. }
  27. if (_canvasGroup == null)
  28. {
  29. Debug.LogError("[ScrollToBottomBehaviour] CanvasGroup not set");
  30. return;
  31. }
  32. _scrollRect.onValueChanged.AddListener(OnScrollRectValueChanged);
  33. Refresh();
  34. }
  35. void OnEnable()
  36. {
  37. Refresh();
  38. }
  39. public void Trigger()
  40. {
  41. if (_scrollToTop)
  42. {
  43. _scrollRect.normalizedPosition = new Vector2(0, 1);
  44. }
  45. else
  46. {
  47. _scrollRect.normalizedPosition = new Vector2(0, 0);
  48. }
  49. }
  50. private void OnScrollRectValueChanged(Vector2 position)
  51. {
  52. Refresh();
  53. }
  54. private void Refresh()
  55. {
  56. if (_scrollRect == null)
  57. return;
  58. var position = _scrollRect.normalizedPosition;
  59. if (position.y < 0.001f || (_scrollToTop && position.y >= 0.999f))
  60. {
  61. SetVisible(false);
  62. }
  63. else
  64. {
  65. SetVisible(true);
  66. }
  67. }
  68. void SetVisible(bool truth)
  69. {
  70. if (truth)
  71. {
  72. _canvasGroup.alpha = 1f;
  73. _canvasGroup.interactable = true;
  74. _canvasGroup.blocksRaycasts = true;
  75. }
  76. else
  77. {
  78. _canvasGroup.alpha = 0f;
  79. _canvasGroup.interactable = false;
  80. _canvasGroup.blocksRaycasts = false;
  81. }
  82. }
  83. }
  84. }