/// Credit CaptainSchnittchen /// Credit TouchPad (OnScroll function) update - GamesRUs /// sourced from: http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-2011648 /*USAGE: Simply place the script on the ScrollRect that contains the selectable children we'll be scrolling to and drag'n'drop the RectTransform of the options "container" that we'll be scrolling.*/ using System; using UnityEngine.EventSystems; namespace UnityEngine.UI.Extensions { [AddComponentMenu("UI/Extensions/ScrollRectEx")] 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; } public override void OnScroll(PointerEventData eventData) { if (!horizontal && Math.Abs(eventData.scrollDelta.x) > Math.Abs(eventData.scrollDelta.y)) { routeToParent = true; } else if (!vertical && Math.Abs(eventData.scrollDelta.x) < Math.Abs(eventData.scrollDelta.y)) { routeToParent = true; } else { routeToParent = false; } if (routeToParent) DoForParents((parent) => { parent.OnScroll(eventData); }); else base.OnScroll(eventData); } } }