作者:ifx0448363 | 来源:互联网 | 2024-11-03 12:58
在Unity中,UGUI借鉴了NGUI的事件监听机制,以实现高效且便捷的交互设计。通过采用类似NGUI的UIEventListener方法,UGUI不仅简化了UI开发流程,还提升了项目的整体性能和用户体验。经过一段时间的实际应用,我们发现这种机制在复杂项目中表现尤为出色,能够显著提高开发效率和代码可维护性。
UGUI-仿照NGUI的事件监听机制
使用unity已经有很长一段时间了,一直在使用NGUI来做UI开发,NGUI的UIEventListener使用上感觉非常方便,这段时间项目综合考虑了NGUI和UGUI后决定使用UGUI来做项目的开发,刚接触UGUI的事件太难用了,看了MOMO的博客很受启发,也学着仿着NGUI的写了一个事件的封装类。分享出来供大家交流学习,有什么不足的地方,希望积极指正。
UGUI的EventSystems命名空间下有一个EventTrigger类,这个类继承了MonoBehiver类并且实现了UGUI事件的接口,来看一下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();
if (listener==null)
{
listener = go.AddComponent();
}
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