UGUI-仿照NGUI的事件监听机制

来源:互联网 发布:首都医科大学知乎 编辑:程序博客网 时间:2024/05/21 19:25

UGUI-仿照NGUI的事件监听机制

使用unity已经有很长一段时间了,一直在使用NGUI来做UI开发,NGUI的UIEventListener使用上感觉非常方便,这段时间项目综合考虑了NGUI和UGUI后决定使用UGUI来做项目的开发,刚接触UGUI的事件太难用了,看了MOMO的博客很受启发,也学着仿着NGUI的写了一个事件的封装类。分享出来供大家交流学习,有什么不足的地方,希望积极指正。
UGUI的EventSystems命名空间下有一个EventTrigger类,这个类继承了MonoBehiver类并且实现了UGUI事件的接口,来看一下EventTrigger类

EventTrigger类

EventTrigger类实现了EventSystem的事件接口,这样的话,我们只需要写一个类让他继承至EventTrigger类,然后重写EventTrigger实现的方法,就可以监听各种事件了,比如重写OnPointerEnter方法,然后广播出去。

public class UGUIEventListener : EventTrigger{    public delegate void MyDelegate(GameObject go);    public event MyDelegate Click;    public event MyDelegate RightClick;    public event MyDelegate DoubleClick;    public event MyDelegate BeginDrag;    public event MyDelegate Drag;    public event MyDelegate EndDrag;    public event MyDelegate PointerEnter;    public event MyDelegate PointerExit;    public event MyDelegate PointerDown;    public event MyDelegate PointerUp;    public override void OnPointerClick(PointerEventData eventData)    {        //双击必定会执行一次单击        if (eventData.button == PointerEventData.InputButton.Left && eventData.clickCount == 2)        {            if (DoubleClick != null)            {                DoubleClick(gameObject);            }        }        else if (eventData.button == PointerEventData.InputButton.Left && eventData.clickCount ==1)        {            if (Click!=null)            {                Click(gameObject);            }        }        else if (eventData.button == PointerEventData.InputButton.Right && eventData.clickCount == 1)        {            if (RightClick!=null)            {                RightClick(gameObject);            }        }          }}

在最后要为游戏物体动态添加这个脚本

  public static UGUIEventListener Get(GameObject go)    {        UGUIEventListener listener = go.GetComponent<UGUIEventListener>();        if (listener==null)        {            listener = go.AddComponent<UGUIEventListener>();        }        return listener;    }

这样就完成了,使用方式跟NGUI是使用没什么区别,使用方式如下(将test脚本挂到UI物体上,就可以监听鼠标的各种事件了)

using UnityEngine;public class test : MonoBehaviour{     void Awake()    {        UGUIEventListener.Get(gameObject).Click += OnLeftClick;    }    private void OnLeftClick(GameObject go)    {        Debug.Log("左键单击");    }}

最后实现的效果如下,也可以通过修改UGUIEventListener的逻辑来使事件更符合实际开发的需求。

实现效果

作者使用的Unity版本是:2017.1.0f3

文章的完整代码我已经共享到百度云了:
链接:http://pan.baidu.com/s/1qXW3HA8 密码:mp1c

原创粉丝点击