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与模型和粒子特效穿插层级管理 ...
随机推荐
- ELK学习记录二 :elasticsearch、logstash及kibana的安装与配置
注意事项: 1.ELK版本要求5.X以上,本人使用版本:elasticsearch-6.0.0.kibana-6.0.0-linux-x86_64.logstash-6.0.0.tar 2.Elast ...
- cassandra 3.x官方文档(5)---探测器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- Vue 踩坑记
参考: https://forum.vuejs.org/t/unknown-issues-in-change-event-of-radio-in-vue-2-x-webpack-2-x/11034 v ...
- Android ocr识别文字介绍(文字识别)
最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...
- [CSDN_Markdown] 使用LaTeX写矩阵
简介 LaTeX 的公式功能非常强大,一次性讲全不是件容易的事情.将LaTeX 的这些功能分成较小的相互独立的部分来讲,一方面方便大家单独查阅:另一方面,所有[CSDN_Markdown]相关的文章都 ...
- Docker与容器
Docker介绍 1. Docker 主要解决什么问题 Docker 对外宣称的是Build.Ship 和Run,Docker 要解决的核心问题就是快速地干这三件事情.它通过将运行环境和应用程序打包到 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 在工作中发现有不少类似的现象,有幸看到国外大牛写的一篇文章,由于已经完善得不能再添油加醋,所以决定直接翻译,原文出处:http ...
- SublimeText3解决中文乱码
1)安装Sublime Package Control. 在Sublime Text 3上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装Package ...
- EBS开发性能优化之SQL语句优化
(1)选择运算 尽可能先做选择运算,这是优化策略中最重要.最基本的一条,选择运算一般会使计算的中间结果大大变小,在对同一表格进行多个选择运算时,选择条件的排列顺序对性能也有很大影响,因为排列顺序不仅影 ...
- UIScrollView实现图片轮播器的无限滚动
简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能. 轮播原 ...