Unity杂文——基于UGUI的UI拖拽监听

  1. 前言
  2. 问题
  3. 方法
  4. 总结

原文地址

前言

如果一个UI的面板想监听拖拽事件通常会有两种方式:

  1. 继承IBeginDragHandler,IDragHandler,IEndDragHandler接口,然后实现自己需要的逻辑。(此方法需要脚本继承MonoBehaviour)
  2. 监听Input的输入,通过判断按下和按住来实现自己拖拽的逻辑。

已经有写好的放发笔者为什么还要写这边文章呢,是因为笔者目前参与的项目中的UI框架,面板的脚本都不是继承MonoBeehaviour的,都是通过统一管理的,这样的方式的好处就是UI的初始化和Update的一些都可以自己控制。面板的View都是通过绑定的方式进行操作的,了解框架的应该都知道,这样的好处有很多,这里就不过多介绍了。

问题

如果一个UI面板是通过绑定的方式进行的,没有继承MonoBehaviour,有不想在Update里写大量的逻辑,我们想见监听一个UI的拖拽应该怎么操作呢。

方法

我们只需要自己写一个继承MonoBehaviour的脚本,然后脚本继承这些接口,在脚本里添加拖拽需要的一些参数,然后脚本里添加我们需要注册的委托就可以了,我们的面板脚本可以绑定面板的UI,我们只需要通过UI物体获取我们需要的拖拽脚本组件,然后注册我们需要的一些委托就可以了。脚本如下:

using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class UDragEvent : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
    private bool m_IsDraging;

    public bool IsDraging
    {
        get => m_IsDraging;
        private set => m_IsDraging = value;
    }

    public Action<PointerEventData> OnBeginDragEvent;
    public Action<PointerEventData> OnDragEvent;
    public Action<PointerEventData> OnEndDragEvent;

    public void OnBeginDrag(PointerEventData eventData)
    {
        OnBeginDragEvent?.Invoke(eventData);
        m_IsDraging = true;
    }

    public void OnDrag(PointerEventData eventData)
    {
        OnDragEvent?.Invoke(eventData);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        OnEndDragEvent?.Invoke(eventData);
        m_IsDraging = false;
    }
}

上述脚本非常简单,只是把一些接口转换成了委托,然后在需要监听拖拽的组件上放上挂上这个脚本,在面板的控制脚本里获取这个脚本,然后绑定上对应的委托就可以使用了。

总结

当我们使用一个接口或者方法的时候,如果我们没有办法直接调用,我们不仅仅只考虑找和它相同功能的方法替换掉,我们还可以通过转换的方式,间接的使用我们需要的。笔者就是通过委托的方式简介的使用了拖拽的接口。不仅仅是拖拽,很多接口我们都可以这样间接使用。也不仅仅是接口,很多开发者遇到的阻挡,我们不应该考虑换路,我们也要考虑能不能跨过阻挡或者绕过阻挡。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 841774407@qq.com

×

喜欢就点赞,疼爱就打赏