unity游戏开发大作业_【Unity游戏开发】Unity横竖滑动列表嵌套

这篇博客介绍了如何在Unity中处理横竖嵌套的滑动列表事件冲突问题。通过实现自定义的UI事件透传,使得在横向滑动的区域,如果用户进行竖向滑动,事件能够传递到父级列表,从而让一级和二级列表都能正确响应拖动。文章提供了具体的C#代码实现,并给出了测试场景的搭建参考。
摘要由CSDN通过智能技术生成

一. 前言

游戏开发过程中,很可能需要制作横竖嵌套的滑动列表。如下效果:

730e95ce8b1b9b6ada44c84708614463.png

Unity的滑动列表会根据用户的操作行为捕获到对应的事件,但是Unity的事件一旦被上层UI捕获,下层UI就不会响应,如果是嵌套列表,那么二级列表就会劫持掉事件,导致一级列表无法拖动。

二. 实现

1. 实现原理

要解决滑动列表嵌套的这个问题,可以根据用户滑动的方向,来进行事件的透传,

  • 比如在横向滑动的区域,如果用户是进行竖向滑动,则把事件透传到父级列表,
  • 如果父级列表是竖向滑动列表,则可以进行响应,否则继续透传。

UI事件透传接口:

ExecuteEvents.Execute<T>(GameObject target,BaseEventData eventData, EventFunction<T> functor)where T : IEventSystemHandler;

2. 具体实现

using UnityEngine;
using UnityEngine.EventSystems;

// 挂载在子item上
public class UIDragEventPass : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    public GameObject Parent;//当子item是动态对象,需要动态去设置这个parent
    //滑动方向
    public Direction m_direction = Direction.Horizontal;
    //当前操作方向
    private Direction m_BeginDragDirection = Direction.Horizontal;

    public enum Direction
    {
        Horizontal,
        Vertical
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        if(Parent)
        {
            m_BeginDragDirection = Mathf.Abs(eventData.delta.x) > Mathf.Abs(eventData.delta.y) ? Direction.Horizontal : Direction.Vertical;
            PassEvent(eventData, ExecuteEvents.beginDragHandler, true);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.dragHandler);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.endDragHandler);
    }

    // 渗透方法
    void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> func, bool isBegin = false) where T : IEventSystemHandler
    {
        if(Parent != null)
        {
            //当前操作方向不等于滑动方向,将事件传给父对象
            if(m_BeginDragDirection != m_direction)
            {
                Parent = ExecuteEvents.GetEventHandler<T>(Parent);
                ExecuteEvents.Execute(Parent, data, func);
            }
        }
    }
}

3. 搭建场景测试

bc00867178d6ea567e85c6c555a7a923.png

b6baea63bf75993425e696a8940aaf47.png

21db6d1908e00fa62a73a6fd009c4247.png

参考:

Unity横竖滑动列表嵌套(UGUI / ScrollRect)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值