Unity中实现嵌套滑动框
Posted Hello Bug.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中实现嵌套滑动框相关的知识,希望对你有一定的参考价值。
一:效果演示
二:前言
Unity中如果两个ScrollRect嵌套在一起,后面的会挡住前面的,当在二级列表区域拖动时导致一级列表无法滑动
三:实现原理
根据滑动的方向,来进行事件的渗透传递,如果当前滑动方向与组件的滑动方向不一致则把事件传递给父级列表
UGUI提供了事件执行的方法:ExecuteEvents.Execute
四:代码实现
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Skyunion;
/// <summary>
/// 嵌套滑动框
/// </summary>
/// 支持嵌套滑动列表的滑动
public class ScrollRectNested : ScrollRect
/// <summary>
/// 滑动方向
/// </summary>
enum EScrollDir
Horizontal,
Vertical,
ScrollRectNested m_SRNested;//不同滑动方向的滑动框
EScrollDir m_ScrollDir;//组件滑动方向
EScrollDir m_CurScrollDir;//当前滑动方向
protected override void Awake()
base.Awake();
Transform parent = transform.parent;
if (parent != null)
m_SRNested = parent.GetComponentInParent<ScrollRectNested>();
m_ScrollDir = horizontal ? EScrollDir.Horizontal : EScrollDir.Vertical;
public override void OnBeginDrag(PointerEventData eventData)
if (m_SRNested != null)
m_CurScrollDir = Mathf.Abs(eventData.delta.x) >= Mathf.Abs(eventData.delta.y)
? EScrollDir.Horizontal
: EScrollDir.Vertical;
if (m_CurScrollDir != m_ScrollDir)
ExecuteEvents.Execute(m_SRNested.gameObject, eventData, ExecuteEvents.beginDragHandler);
return;
base.OnBeginDrag(eventData);
public override void OnDrag(PointerEventData eventData)
if (m_SRNested != null)
if (m_CurScrollDir != m_ScrollDir)
ExecuteEvents.Execute(m_SRNested.gameObject, eventData, ExecuteEvents.dragHandler);
return;
base.OnDrag(eventData);
public override void OnEndDrag(PointerEventData eventData)
if (m_SRNested != null)
if (m_CurScrollDir != m_ScrollDir)
ExecuteEvents.Execute(m_SRNested.gameObject, eventData, ExecuteEvents.endDragHandler);
return;
base.OnEndDrag(eventData);
public override void OnScroll(PointerEventData data)
if (m_SRNested != null)
if (m_CurScrollDir != m_ScrollDir)
ExecuteEvents.Execute(m_SRNested.gameObject, data, ExecuteEvents.scrollHandler);
return;
base.OnScroll(data);
以上是关于Unity中实现嵌套滑动框的主要内容,如果未能解决你的问题,请参考以下文章
Unity中实现Tab键切换输入框按钮(按Tab键切换高亮显示的UI)