在unity中处理UI事件时,习惯了使用NGUI的UIEventListener,虽然UGUI也有AddListener,但是一个组件只能对应一个函数,不能在一个函数中同时处理多个事件,显得有些麻烦

因为主要平时Button用得比较多,这里以UGUI的Button为例,自己以UGUI的Button的AddListener模仿NGUI的UIEventListener做了一个小封装,能在一个函数处理多个Button

using UnityEngine;
using UnityEngine.UI;
using System.Collections; public class UGUIButtonEventListener : MonoBehaviour { public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public static UGUIButtonEventListener GetClick(Button btn)
{
UGUIButtonEventListener listener = btn.GetComponent<UGUIButtonEventListener>();
if (listener == null)
listener = btn.gameObject.AddComponent<UGUIButtonEventListener>();
btn.onClick.AddListener(listener.OnClick);
return listener;
} void OnClick()
{
if (onClick != null)
onClick(gameObject);
}
}

测试代码:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems; public class test : MonoBehaviour
{
public Button[] btns;
void Start()
{
for (int i = 0; i < btns.Length; i++)
UGUIButtonEventListener.Get(btns[i]).onClick = OnClick;
} void OnClick(GameObject go)
{
print("name:"+go.name);
}
}

还有人给了另一个Button事件监听的方法,感觉也挺好用

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems; public class test : MonoBehaviour
{
public Button[] btns;
void Start()
{
for (int i = 0; i < btns.Length; i++)
{
GameObject btnObj=btns[i].gameObject;
btns[i].onClick.AddListener(delegate(){OnClick(btnObj);});
}
} void OnClick(GameObject go)
{
print("name:"+go.name);
}
}

但是UI事件肯定不止Button的Click事件,如果所有事件都按照上面的方法来封装就显得有些杂乱了。所以自己再去看了看UGUI的一些事件接口,发现通过实现接口,就能封装了,比如IPointerClickHandler,可以实现Click事件,IPointerEnterHandler、IPointerExitHandler可以实现Hover事件。后来再在网上查了一些资料,发现了EventTrigger已经继承了所有接口,正好可以用来封装UIEventListener

实现代码如下:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems; public class UGUIEventListener:EventTrigger
{
public delegate void VoidDelegate(GameObject go);
public delegate void BoolDelegate(GameObject go, bool isValue);
public delegate void FloatDelegate(GameObject go, float fValue);
public delegate void IntDelegate(GameObject go, int iIndex);
public delegate void StringDelegate(GameObject go, string strValue); public VoidDelegate onSubmit;
public VoidDelegate onClick;
public BoolDelegate onHover;
public BoolDelegate onToggleChanged;
public FloatDelegate onSliderChanged;
public FloatDelegate onScrollbarChanged;
public IntDelegate onDrapDownChanged;
public StringDelegate onInputFieldChanged; public override void OnSubmit(BaseEventData eventData)
{
if (onSubmit != null)
onSubmit(gameObject);
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onHover != null)
onHover(gameObject, true);
}
public override void OnPointerClick(PointerEventData eventData)
{
if (onClick != null)
onClick(gameObject);
if (onToggleChanged != null)
onToggleChanged(gameObject, gameObject.GetComponent<Toggle>().isOn); }
public override void OnPointerExit(PointerEventData eventData)
{
if (onHover != null)
onHover(gameObject, false);
}
public override void OnDrag(PointerEventData eventData)
{
if (onSliderChanged != null)
onSliderChanged(gameObject, gameObject.GetComponent<Slider>().value);
if (onScrollbarChanged != null)
onScrollbarChanged(gameObject, gameObject.GetComponent<Scrollbar>().value); }
public override void OnSelect(BaseEventData eventData)
{
if (onDrapDownChanged != null)
onDrapDownChanged(gameObject, gameObject.GetComponent<Dropdown>().value);
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (onInputFieldChanged != null)
onInputFieldChanged(gameObject, gameObject.GetComponent<InputField>().text);
}
public override void OnDeselect(BaseEventData eventData)
{
if (onInputFieldChanged != null)
onInputFieldChanged(gameObject, gameObject.GetComponent<InputField>().text);
} public static UGUIEventListener Get(GameObject go)
{
UGUIEventListener listener =go.GetComponent<UGUIEventListener>();
if(listener==null) listener=go.AddComponent<UGUIEventListener>();
return listener;
}
}

测试代码如下:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems; public class test : MonoBehaviour
{
public Button[] btns;
public Scrollbar scrollbar;
void Start()
{
for (int i = 0; i < btns.Length; i++)
UGUIEventListener.Get(btns[i].gameObject).onClick = OnClick;
UGUIEventListener.Get(scrollbar.gameObject).onScrollbarChanged = OnScrollbarChanged;
} void OnClick(GameObject go)
{
print("name:"+go.name);
} void OnScrollbarChanged(GameObject go, float value)
{
print("name:" + go.name + " value:" + value);
}
}

最后,还有一个小东西,因为自己在做一些测试的时候,发现UGUI的点击事件与3D物体的射线碰撞,是会发生冲突的,理论上,自己在点击UI的时候,3D物体的射线碰撞检测就会取消,不能让他们同时响应,这里用一个函数就可以判断EventSystem.current.IsPointerOverGameObject()

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems; public class test : MonoBehaviour
{
void Update()
{
if (EventSystem.current.IsPointerOverGameObject())
Debug.Log("鼠标在UI上");
else
Debug.Log("鼠标没在UI上");
}
}

UGUI实现NGUI的UIEventListener功能的更多相关文章

  1. 【转】UGUI VS NGUI

    原文:http://gad.qq.com/college/articledetail/7191053 注[1]:该比较是基于15年-16年期间使用NGUI(3.8.0版本)与UGUI(4.6.9版本) ...

  2. 转:UGUI与NGUI的区别与优缺点

    1. NGUI与UGUI的区别 1) uGUI的Canvas 有世界坐标和屏幕坐标   2) uGUI的Image可以使用material     3) UGUI通过Mask来裁剪,而NGUI通过Pa ...

  3. uGUI VS NGUI

    前言 这篇日志的比较是根据自己掌握知识所写的,请各路大神多多指教. 引擎版本: Unity 4.6 beta 两者区别 1.uGUI的Canvas 有世界坐标和屏幕坐标 2.uGUI的Button属性 ...

  4. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...

  5. Unity3D 使用Socket处理数据并将数据 在UGUI、NGUI上显示出来

    Unity3d 不支持C#的线程直接调用Unity3D 主线程才能实现的功能.例如:给UGUI text 赋值.改变Color值等.怎样解决这个问题呢?使用一个Loom脚本. 按照惯例贴上代码. 首先 ...

  6. UGUI和NGUI的优化分享

    学习资料 来自UWA的分享,针对于Unity 4.x 及5.3 以下版本,Unity5.5及更高版本可能适用. 文章:UWA技术直播视频集锦 UGUI &NGUI http://blog.uw ...

  7. NGUI实现ScrollView功能

    NGUI,目前Unity3D Assert Store中最火的2D图形界面工具. 本文假设读者有Unity3D使用经验.有基本了解.NGUI3.6.0 1.新建Pannel(Scroll View), ...

  8. Unity3d使用UGUI实现长按功能

    UGUI的Button组件只有OnClick事件的监听,要实现长按功能,要监听按下事件和抬起事件,所以要使用到EventTrigger组件中的OnPointerDown和OnPointerUp来监听. ...

  9. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

随机推荐

  1. ACM Let the Balloon Rise

    Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...

  2. MySQL DATEDIFF() 函数

    定义和用法 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间表达式. 注释:只有值的日期部 ...

  3. BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...

  4. pg备份恢复与设置编码

    psql create database jasygl encoding='UTF8' TEMPLATE = template0; 命令行 备份 pg_dump dabase_name > ba ...

  5. Bootstrap3 排版-内联文本元素

    标记文本 突出显示的文本由于其相关性在另一个上下文中,使用<mark>标记. You can use the mark tag to highlight text. You can use ...

  6. JBOSS EAP实战(1)

    JBOSS的诞生 1998年,在硅谷SUN公司的SAP实验室,一个年轻人正坐在电脑前面思考,然后写着什么东西.不,他没有在写程序,他在写辞呈.他正在做出人生的一个重大决定:他要辞掉在SUN的这份工作, ...

  7. Linux文件格式化与相关处理及sed工具

    http://blog.csdn.net/pipisorry/article/details/52564957 geditor, sed, ed, awk, Emacs 文本处理工具 [Linux S ...

  8. J2EE进阶(十八)基于留言板分析SSH工作流程

    J2EE进阶(十八)基于留言板分析SSH工作流程   留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构.   工作流程(以用户登录为例):   首先是用 ...

  9. iOS 滚动视图的复用问题解决方案

    LazyScroll是什么 LazyScrollView 继承自ScrollView,目标是解决异构(与TableView的同构对比)滚动视图的复用回收问题.它可以支持跨View层的复用,用易用方式来 ...

  10. SpringMVC常用配置

    关于Spring.SpringMVC我们前面几篇博客都介绍了很多,但是还不够,这些框架中涉及到的注解.配置非常多,那么我们今天再来介绍一个SpringMVC的基本配置,灵活的使用这些配置,可以让我们在 ...