UGUI实现NGUI的UIEventListener功能
在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功能的更多相关文章
- 【转】UGUI VS NGUI
原文:http://gad.qq.com/college/articledetail/7191053 注[1]:该比较是基于15年-16年期间使用NGUI(3.8.0版本)与UGUI(4.6.9版本) ...
- 转:UGUI与NGUI的区别与优缺点
1. NGUI与UGUI的区别 1) uGUI的Canvas 有世界坐标和屏幕坐标 2) uGUI的Image可以使用material 3) UGUI通过Mask来裁剪,而NGUI通过Pa ...
- uGUI VS NGUI
前言 这篇日志的比较是根据自己掌握知识所写的,请各路大神多多指教. 引擎版本: Unity 4.6 beta 两者区别 1.uGUI的Canvas 有世界坐标和屏幕坐标 2.uGUI的Button属性 ...
- Unity UGUI 实现简单拖拽功能
说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...
- Unity3D 使用Socket处理数据并将数据 在UGUI、NGUI上显示出来
Unity3d 不支持C#的线程直接调用Unity3D 主线程才能实现的功能.例如:给UGUI text 赋值.改变Color值等.怎样解决这个问题呢?使用一个Loom脚本. 按照惯例贴上代码. 首先 ...
- UGUI和NGUI的优化分享
学习资料 来自UWA的分享,针对于Unity 4.x 及5.3 以下版本,Unity5.5及更高版本可能适用. 文章:UWA技术直播视频集锦 UGUI &NGUI http://blog.uw ...
- NGUI实现ScrollView功能
NGUI,目前Unity3D Assert Store中最火的2D图形界面工具. 本文假设读者有Unity3D使用经验.有基本了解.NGUI3.6.0 1.新建Pannel(Scroll View), ...
- Unity3d使用UGUI实现长按功能
UGUI的Button组件只有OnClick事件的监听,要实现长按功能,要监听按下事件和抬起事件,所以要使用到EventTrigger组件中的OnPointerDown和OnPointerUp来监听. ...
- Unity NGUI和UGUI与模型、特效的层级关系
目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...
随机推荐
- django模板语言中的extends,block和include
extends和block一起用 它们用于母版和子版的继承 在母版html中将一些需要替换的部分用{% block xxx %}...{% endblock %}括起来, 在子版html中,在第一行需 ...
- ZooKeeper之(四)配置与命令
4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为"zoo_sample.cfg"的文件,是ZooKeeper配置文件的模板. ZooKe ...
- 计算机网络之局域网&以太网
局域网的拓扑结构 局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限. 局域网具有广播功能,从一个站点可很方便地访问全网,局域网上的主机可共享连接在局域网上的各种硬件和软件资源. ...
- 我的第一本著作:Spark技术内幕上市!
现在各大网站销售中! 京东:http://item.jd.com/11770787.html 当当:http://product.dangdang.com/23776595.html 亚马逊:http ...
- Scala:字符串
http://blog.csdn.net/pipisorry/article/details/52902348 Scala字符串 在 Scala 中,字符串的类型实际上是 Java String,它本 ...
- YYModel V1.0.4源码解析
YYKit出现了很长时间了,一直想要详细解析一下它的源码,都是各种缘由推迟了. 最近稍微闲了一点,决定先从最简单的YYModel开始吧. 首先,我也先去搜索了一下YYModel相关的文章,解析主要AP ...
- Android系统的安全设计与架构
Android系统的安全设计与架构 一.安全策略 1.Android 的总体架构由5个主要层次上的组件构成,这5层是:Android应用层. Android框架层.Dalvik虚拟机层.用户空间原生代 ...
- qsort函数应用大全
七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , c ...
- Hive-RCFile文件存储格式
在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile. 一.RCFile文件结构 下图是一个RCFile的文件结构形式. 从上图可以看出: 1)一张表 ...
- EBS值集,弹性域常用表
值集 select * from fnd_flex_value_sets select * from fnd_flex_values select * from fnd_flex_valu ...