Skip to content

Instantly share code, notes, and snippets.

@benloong
Forked from Josef212/NesteScrollRect.cs
Created December 28, 2022 08:00
Show Gist options
  • Save benloong/19e5d8c7980eb76064802e167b12825b to your computer and use it in GitHub Desktop.
Save benloong/19e5d8c7980eb76064802e167b12825b to your computer and use it in GitHub Desktop.
A nested ScrollRect for unity
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class NestedScrollRect : ScrollRect
{
public override void OnInitializePotentialDrag(PointerEventData eventData)
{
for(int i = 0; i < m_parentInitializePotentialDragHandlers.Length; ++i)
{
m_parentInitializePotentialDragHandlers[i].OnInitializePotentialDrag(eventData);
}
base.OnInitializePotentialDrag(eventData);
}
public override void OnBeginDrag(PointerEventData eventData)
{
m_routeToParent = (!horizontal && Mathf.Abs(eventData.delta.x) > Mathf.Abs(eventData.delta.y)) || (!vertical && Mathf.Abs(eventData.delta.x) < Mathf.Abs(eventData.delta.y));
if (m_routeToParent)
{
for(int i = 0; i < m_parentBeginDragHandlers.Length; ++i)
{
m_parentBeginDragHandlers[i].OnBeginDrag(eventData);
}
}
else
{
base.OnBeginDrag(eventData);
}
}
public override void OnDrag(PointerEventData eventData)
{
if(m_routeToParent)
{
for(int i = 0; i < m_parentDragHandlers.Length; ++i)
{
m_parentDragHandlers[i].OnDrag(eventData);
}
}
else
{
base.OnDrag(eventData);
}
}
public override void OnEndDrag(PointerEventData eventData)
{
if (m_routeToParent)
{
for(int i = 0; i < m_parentEndDragHandlers.Length; ++i)
{
m_parentEndDragHandlers[i].OnEndDrag(eventData);
}
}
else
{
base.OnEndDrag(eventData);
}
m_routeToParent = false;
}
protected override void Awake()
{
base.Awake();
if(m_parentScrollRect == null)
{
throw new System.NullReferenceException("Parent Scroll Rect is null");
}
m_parentInitializePotentialDragHandlers = m_parentScrollRect.GetComponents<IInitializePotentialDragHandler>();
m_parentBeginDragHandlers = m_parentScrollRect.GetComponents<IBeginDragHandler>();
m_parentDragHandlers = m_parentScrollRect.GetComponents<IDragHandler>();
m_parentEndDragHandlers = m_parentScrollRect.GetComponents<IEndDragHandler>();
}
[SerializeField] private ScrollRect m_parentScrollRect = null;
private bool m_routeToParent = false;
private IInitializePotentialDragHandler[] m_parentInitializePotentialDragHandlers = null;
private IBeginDragHandler[] m_parentBeginDragHandlers = null;
private IDragHandler[] m_parentDragHandlers = null;
private IEndDragHandler[] m_parentEndDragHandlers = null;
}
using UnityEditor;
[CustomEditor(typeof(NestedScrollRect))]
[CanEditMultipleObjects]
public class NestedScrollRectEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
}
}
@pmhieu998
Copy link

Thank you for upload this. May I ask if you had tutorial on how to use this ? I just started on Unity and I think I have wasted too much time on how to compile this code to the NestedScrollView.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment