Unity中使用ScrollRect实现嵌套的滑动效果!

视频地址:https://www.bilibili.com/video/BV1nY4y1w7Vs?spm_id_from=333.337.search-card.all.click

/*
*┌────────────────────────────────┐
*│ 描   述:嵌套的滑动
*│ 类   名:NetedScrollView.cs 
*│ 创  建  人:
*└────────────────────────────────┘
*/

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace D_Bug{
    
    
	public class NetedScrollView : ScrollRect
	{
    
    
        private enum SlideDir
        {
    
    
            Horizontal,
            Vertical
        }
        #region Variables
        private NetedScrollView m_parentNetedScrollView;

        private SlideDir m_currentSlideDir;                 //当前滑动方向
        private SlideDir m_componentSlideDir;               //当前组件的滑动方向

        #endregion

        protected override void Awake()
        {
    
    
            base.Awake();
            m_parentNetedScrollView = transform.parent.GetComponentInParent<NetedScrollView>();
            m_componentSlideDir = horizontal ? SlideDir.Horizontal : SlideDir.Vertical;
        }

        public override void OnBeginDrag(PointerEventData eventData)
        {
    
    
            if (m_parentNetedScrollView != null)
            {
    
    
                m_currentSlideDir = Mathf.Abs(eventData.delta.x)>=Mathf.Abs(eventData.delta.y) ? SlideDir.Horizontal : SlideDir.Vertical;

                if(m_currentSlideDir != m_componentSlideDir)
                {
    
    
                    ExecuteEvents.Execute(m_parentNetedScrollView.gameObject, eventData, ExecuteEvents.beginDragHandler);
                    return;
                }
            }

            base.OnBeginDrag(eventData);
        }
        public override void OnDrag(PointerEventData eventData)
        {
    
    
            if (m_currentSlideDir != m_componentSlideDir && m_parentNetedScrollView!=null)
            {
    
    
                ExecuteEvents.Execute(m_parentNetedScrollView.gameObject, eventData, ExecuteEvents.dragHandler);
                return;
            }
            base.OnDrag(eventData);
        }

        public override void OnEndDrag(PointerEventData eventData)
        {
    
    
            if (m_currentSlideDir != m_componentSlideDir && m_parentNetedScrollView != null)
            {
    
    
                ExecuteEvents.Execute(m_parentNetedScrollView.gameObject, eventData, ExecuteEvents.endDragHandler);
                return;
            }
            base.OnEndDrag(eventData);
            while
        }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_30163099/article/details/126168230