前言
如果一个UI的面板想监听拖拽事件通常会有两种方式:
- 继承IBeginDragHandler,IDragHandler,IEndDragHandler接口,然后实现自己需要的逻辑。(此方法需要脚本继承MonoBehaviour)
- 监听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;
}
}
上述脚本非常简单,只是把一些接口转换成了委托,然后在需要监听拖拽的组件上放上挂上这个脚本,在面板的控制脚本里获取这个脚本,然后绑定上对应的委托就可以使用了。
总结
当我们使用一个接口或者方法的时候,如果我们没有办法直接调用,我们不仅仅只考虑找和它相同功能的方法替换掉,我们还可以通过转换的方式,间接的使用我们需要的。笔者就是通过委托的方式简介的使用了拖拽的接口。不仅仅是拖拽,很多接口我们都可以这样间接使用。也不仅仅是接口,很多开发者遇到的阻挡,我们不应该考虑换路,我们也要考虑能不能跨过阻挡或者绕过阻挡。