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 scrollRects = new Dictionary(); 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(true); for (int i = 0; i < componenst.Length; i++) { componenst[i].raycastTarget = false; } } #endif enum Direction { None, Horizontal, Vertical, Both, } }