namespace SRF.UI { using System; using Internal; using UnityEngine; using UnityEngine.UI; [ExecuteInEditMode] [RequireComponent(typeof(RectTransform))] [AddComponentMenu(ComponentMenuPaths.ScrollToBottom)] public class ScrollToBottomBehaviour : MonoBehaviour { #pragma warning disable 649 [SerializeField] private ScrollRect _scrollRect; [SerializeField] private CanvasGroup _canvasGroup; [SerializeField] private bool _scrollToTop; #pragma warning restore 649 public void Start() { if (_scrollRect == null) { Debug.LogError("[ScrollToBottomBehaviour] ScrollRect not set"); return; } if (_canvasGroup == null) { Debug.LogError("[ScrollToBottomBehaviour] CanvasGroup not set"); return; } _scrollRect.onValueChanged.AddListener(OnScrollRectValueChanged); Refresh(); } void OnEnable() { Refresh(); } public void Trigger() { if (_scrollToTop) { _scrollRect.normalizedPosition = new Vector2(0, 1); } else { _scrollRect.normalizedPosition = new Vector2(0, 0); } } private void OnScrollRectValueChanged(Vector2 position) { Refresh(); } private void Refresh() { if (_scrollRect == null) return; var position = _scrollRect.normalizedPosition; if (position.y < 0.001f || (_scrollToTop && position.y >= 0.999f)) { SetVisible(false); } else { SetVisible(true); } } void SetVisible(bool truth) { if (truth) { _canvasGroup.alpha = 1f; _canvasGroup.interactable = true; _canvasGroup.blocksRaycasts = true; } else { _canvasGroup.alpha = 0f; _canvasGroup.interactable = false; _canvasGroup.blocksRaycasts = false; } } } }