Unity中如何通过代码判断滚动状态并动态显示滚动提示?
修复ScrollHint脚本问题
你的脚本存在两个核心问题:
- 启用时初始化不完整:只判断了底部提示,未处理顶部提示,也没检查是否实际可滚动
- 未判断滚动可行性:不管内容是否能滚动,都会根据normalizedPosition显示提示
以下是修复后的完整代码:
using UnityEngine; using UnityEngine.UI; public class ScrollHint : MonoBehaviour { [SerializeField] private GameObject _topHint; [SerializeField] private GameObject _bottomHint; [SerializeField] private ScrollRect _scrollRect; private void OnEnable() { _scrollRect.onValueChanged.AddListener(OnScrollValueChanged); // 启用时立即更新提示状态 UpdateHintStates(); } private void OnDisable() { // 移除监听避免内存泄漏 _scrollRect.onValueChanged.RemoveListener(OnScrollValueChanged); } private void OnScrollValueChanged(Vector2 vector) { UpdateHintStates(); } private void UpdateHintStates() { // 先判断是否实际可垂直滚动 bool canScrollVertically = IsScrollable(); // 不可滚动时直接隐藏所有提示 if (!canScrollVertically) { _topHint.SetActive(false); _bottomHint.SetActive(false); return; } float normalizedY = _scrollRect.verticalNormalizedPosition; // 顶部提示:当未滚动到最顶部时显示,否则隐藏 _topHint.SetActive(normalizedY < 1f); // 底部提示:当未滚动到最底部时显示,否则隐藏 _bottomHint.SetActive(normalizedY > 0f); } // 判断ScrollRect是否垂直可滚动 private bool IsScrollable() { if (_scrollRect.content == null || _scrollRect.viewport == null) return false; // 内容高度 > 视口高度时才可以滚动 float contentHeight = _scrollRect.content.rect.height; float viewportHeight = _scrollRect.viewport.rect.height; return contentHeight > viewportHeight; } }
关键修复点说明
- 新增滚动可行性判断:通过
IsScrollable()方法检查内容高度是否超过视口,不可滚动时直接隐藏所有提示 - 完整初始化逻辑:OnEnable中直接调用
UpdateHintStates(),一次性完成所有提示的状态初始化 - 简化状态更新逻辑:合并原有的
UpdateScrollTips和BorderCheck,直接根据normalizedPosition设置提示的激活状态,避免冗余判断 - 添加监听移除:OnDisable中移除ScrollRect的监听,防止对象销毁后出现空引用错误
内容的提问来源于stack exchange,提问作者VitiX
相关产品推荐
相关产品推荐

