/* Credit: CaptainSchnittchen https://forum.unity.com/threads/nested-scrollrect.268551/ */ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EnhancedScrollerDemos.NestedScrollers { using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using UnityEngine.EventSystems; public class ScrollRectEx : ScrollRect { private bool routeToParent = false; /// /// Do action for all parents /// private void DoForParents(Action action) where T : IEventSystemHandler { Transform parent = transform.parent; while (parent != null) { foreach (var component in parent.GetComponents()) { if (component is T) action((T)(IEventSystemHandler)component); } parent = parent.parent; } } /// /// Always route initialize potential drag event to parents /// public override void OnInitializePotentialDrag(PointerEventData eventData) { DoForParents((parent) => { parent.OnInitializePotentialDrag(eventData); }); base.OnInitializePotentialDrag(eventData); } /// /// Drag event /// public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData) { if (routeToParent) DoForParents((parent) => { parent.OnDrag(eventData); }); else base.OnDrag(eventData); } /// /// Begin drag event /// public override void OnBeginDrag(UnityEngine.EventSystems.PointerEventData eventData) { if (!horizontal && Math.Abs(eventData.delta.x) > Math.Abs(eventData.delta.y)) routeToParent = true; else if (!vertical && Math.Abs(eventData.delta.x) < Math.Abs(eventData.delta.y)) routeToParent = true; else routeToParent = false; if (routeToParent) DoForParents((parent) => { parent.OnBeginDrag(eventData); }); else base.OnBeginDrag(eventData); } /// /// End drag event /// public override void OnEndDrag(UnityEngine.EventSystems.PointerEventData eventData) { if (routeToParent) DoForParents((parent) => { parent.OnEndDrag(eventData); }); else base.OnEndDrag(eventData); routeToParent = false; } } }