using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; // Прокрутка внутри прокрутки (например, лента карточек вбок внутри вертикального списка). // Свайп в сторону своей оси листает эту ленту, свайп поперёк и колесо мыши -- родительский список. // Без этого палец на ленте "застревает": общий список не прокручивается. public class NestedScrollRect : ScrollRect { ScrollRect parentScroll; bool routeToParent; protected override void Start() { base.Start(); if (transform.parent != null) parentScroll = transform.parent.GetComponentInParent(); } bool CrossAxis(PointerEventData e) { float dx = Mathf.Abs(e.delta.x), dy = Mathf.Abs(e.delta.y); return horizontal && !vertical ? dy > dx : vertical && !horizontal ? dx > dy : false; } public override void OnInitializePotentialDrag(PointerEventData e) { if (parentScroll != null) parentScroll.OnInitializePotentialDrag(e); base.OnInitializePotentialDrag(e); } public override void OnBeginDrag(PointerEventData e) { routeToParent = parentScroll != null && CrossAxis(e); if (routeToParent) parentScroll.OnBeginDrag(e); else base.OnBeginDrag(e); } public override void OnDrag(PointerEventData e) { if (routeToParent) parentScroll.OnDrag(e); else base.OnDrag(e); } public override void OnEndDrag(PointerEventData e) { if (routeToParent) parentScroll.OnEndDrag(e); else base.OnEndDrag(e); routeToParent = false; } public override void OnScroll(PointerEventData e) { if (parentScroll != null) parentScroll.OnScroll(e); else base.OnScroll(e); } }