using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using UnityEngine.UI; 
 | 
using UnityEngine.EventSystems; 
 | 
  
 | 
public class ScrollRectGroup : MonoBehaviour, IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler, IDragHandler 
 | 
{ 
 | 
    [SerializeField] ScrollRect[] m_ScrollRects; 
 | 
    [SerializeField] Direction m_OnlyDirection; 
 | 
    [SerializeField] float m_Offset = 100f; 
 | 
  
 | 
    Dictionary<Direction, ScrollRect> scrollRects = new Dictionary<Direction, ScrollRect>(); 
 | 
  
 | 
    Direction m_Direction = Direction.None; 
 | 
    Direction direction 
 | 
    { 
 | 
        get { return m_Direction; } 
 | 
        set 
 | 
        { 
 | 
            if (value != m_Direction) 
 | 
            { 
 | 
                m_Direction = value; 
 | 
  
 | 
                scrollRects[Direction.Horizontal].horizontal = direction == Direction.Horizontal 
 | 
                    || direction == Direction.Both; 
 | 
                scrollRects[Direction.Vertical].vertical = direction == Direction.Vertical 
 | 
                    || direction == Direction.Both; 
 | 
                scrollRects[Direction.Both].horizontal = direction == Direction.Horizontal 
 | 
                    || direction == Direction.Both; 
 | 
                scrollRects[Direction.Both].vertical = direction == Direction.Vertical 
 | 
                    || direction == Direction.Both; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    Vector2 m_StartPosition = Vector2.zero; 
 | 
  
 | 
  
 | 
  
 | 
    private void Awake() 
 | 
    { 
 | 
        for (int i = 0; i < m_ScrollRects.Length; i++) 
 | 
        { 
 | 
            var scrollRect = m_ScrollRects[i]; 
 | 
            if (scrollRect.horizontal && scrollRect.vertical) 
 | 
            { 
 | 
                scrollRects.Add(Direction.Both, scrollRect); 
 | 
            } 
 | 
            else if (scrollRect.horizontal) 
 | 
            { 
 | 
                scrollRects.Add(Direction.Horizontal, scrollRect); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                scrollRects.Add(Direction.Vertical, scrollRect); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        Initialize(); 
 | 
    } 
 | 
  
 | 
    public void Initialize() 
 | 
    { 
 | 
        direction = Direction.Both; 
 | 
  
 | 
        scrollRects[Direction.Both].horizontalNormalizedPosition = 0f; 
 | 
        scrollRects[Direction.Both].verticalNormalizedPosition = 1f; 
 | 
        scrollRects[Direction.Horizontal].horizontalNormalizedPosition = 0f; 
 | 
        scrollRects[Direction.Vertical].verticalNormalizedPosition = 1f; 
 | 
    } 
 | 
  
 | 
    public void OnBeginDrag(PointerEventData eventData) 
 | 
    { 
 | 
        direction = Direction.Both; 
 | 
  
 | 
        foreach (var scrollRect in m_ScrollRects) 
 | 
        { 
 | 
            scrollRect.OnBeginDrag(eventData); 
 | 
        } 
 | 
  
 | 
        m_StartPosition = eventData.position; 
 | 
    } 
 | 
  
 | 
    public void OnDrag(PointerEventData eventData) 
 | 
    { 
 | 
        var position = eventData.position; 
 | 
        if (direction == Direction.Both) 
 | 
        { 
 | 
            if (m_OnlyDirection == Direction.Both) 
 | 
            { 
 | 
                var horizontal = Mathf.Abs(position.x - m_StartPosition.x) > m_Offset; 
 | 
                var vertical = !horizontal && Mathf.Abs(position.y - m_StartPosition.y) > m_Offset; 
 | 
                if (horizontal || vertical) 
 | 
                { 
 | 
                    var _direction = horizontal ? Direction.Horizontal : Direction.Vertical; 
 | 
                    if (_direction != direction) 
 | 
                    { 
 | 
                        direction = _direction; 
 | 
                        foreach (var scrollRect in m_ScrollRects) 
 | 
                        { 
 | 
                            scrollRect.OnBeginDrag(eventData); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                direction = m_OnlyDirection; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if (direction != Direction.Both) 
 | 
        { 
 | 
            foreach (var scrollRect in m_ScrollRects) 
 | 
            { 
 | 
                scrollRect.OnDrag(eventData); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void OnEndDrag(PointerEventData eventData) 
 | 
    { 
 | 
        foreach (var scrollRect in m_ScrollRects) 
 | 
        { 
 | 
            scrollRect.OnEndDrag(eventData); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void OnInitializePotentialDrag(PointerEventData eventData) 
 | 
    { 
 | 
        foreach (var scrollRect in m_ScrollRects) 
 | 
        { 
 | 
            scrollRect.OnInitializePotentialDrag(eventData); 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if UNITY_EDITOR 
 | 
    [ContextMenu("CloseRayAccepter")] 
 | 
    void BatchCloseRayAccepter() 
 | 
    { 
 | 
        var componenst = transform.GetComponentsInChildren<Graphic>(true); 
 | 
        for (int i = 0; i < componenst.Length; i++) 
 | 
        { 
 | 
            componenst[i].raycastTarget = false; 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    enum Direction 
 | 
    { 
 | 
        None, 
 | 
        Horizontal, 
 | 
        Vertical, 
 | 
        Both, 
 | 
    } 
 | 
} 
 |