首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之控件以及按钮的监听事件系统(五)
2014
10-27

UGUI研究院之控件以及按钮的监听事件系统(五)

继续学习,我相信大家在做NGUI开发的时候处理事件都会用到UIEventListener,那么UGUI中怎么办呢?先看UGUI的事件有那些吧。

Supported Events

The Eventsystem supports a number of events, and they can be customised further in user custom user written InputModules.

The events that are supported by the StandaloneInputModule and TouchInputModule are provided by interface and can be implemented on a MonoBehaviour by implementing the interface. If you have a valid EventSystem configured the events will be called at the correct time.

IPointerEnterHandler – OnPointerEnter – Called when a pointer enters the object
IPointerExitHandler – OnPointerExit – Called when a pointer exits the object
IPointerDownHandler – OnPointerDown – Called when a pointer is pressed on the object
IPointerUpHandler – OnPointerUp – Called when a pointer is released (called on the original the pressed object)
IPointerClickHandler – OnPointerClick – Called when a pointer is pressed and released on the same object
IBeginDragHandler – OnBeginDrag – Called on the drag object when dragging is about to begin
IDragHandler – OnDrag – Called on the drag object when a drag is happening
IEndDragHandler – OnEndDrag – Called on the drag object when a drag finishes
IDropHandler – OnDrop – Called on the object where a drag finishes
IScrollHandler – OnScroll – Called when a mouse wheel scrolls
IUpdateSelectedHandler – OnUpdateSelected – Called on the selected object each tick
ISelectHandler – OnSelect – Called when the object becomes the selected object
IDeselectHandler – OnDeselect – Called on the selected object becomes deselected
IMoveHandler – OnMove – Called when a move event occurs (left, right, up, down, ect)
ISubmitHandler – OnSubmit – Called when the submit button is pressed
ICancelHandler – OnCancel – Called when the cancel button is pressed

http://docs.unity3d.com/460/Documentation/Manual/SupportedEvents.html

OK 怎么样才能让UGUI监听的方式和NGUI差不多呢? 这里我给大家引一个思路,把下面代码放在你的项目里。

然后在你的界面里面写入监听按钮的代码。

虽然还有一些别的监听方式,但是我觉得这种方式是最科学的,大家可根据自己项目的需求继续拓展EventTriggerListener类。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 大大 我想问ugui在限制区域怎么响应触摸事件或者鼠标点击事件 我用滑动scroll的时候也会触发3d模型物体的移动事件(3d模型是根据鼠标的移动旋转) 怎么解决 求个思路

    • momo大大 我在做角色展示界面的时候 最底层是3d背景 其次3d模型(透视相机) 然后是uiRoot层(里面有个ui摄像机正交的),最外层是按钮层(也是在uiRoot里面的iamge背景)我也在想点击角色周围使角色旋转 我是应该把事件组件放在最外层 还是做穿透放在3d背景层 (穿透又应该大概怎么做)

  2. momo你好,我想问问,可不可以用射线检测来触发ugui button里面的高亮动画呀?是在on select()里面写吗?

  3. 貌似有更简单的办法:把这个代码添加给需要响应事件的UI就行using UnityEngine;using System.Collections;using UnityEngine.EventSystems;public class EventOrder : MonoBehaviour,IPointerClickHandler { #region IPointerClickHandler implementation public void OnPointerClick (PointerEventData eventData) { //throw new System.NotImplementedException (); Debug.Log(name); Debug.Log(eventData.pointerCurrentRaycast.gameObject); } #endregion // Use this for initialization void Start () { } // Update is called once per frame void Update () { }}

  4. MOMO你好,你着个方法有BUG 比如我在一个物体上加了拖动功能,用你的着个方法给物体加OnClick事件 那拖动就失效了

    • 是的,我也碰到了。但是用momo大神以前的代码貌似就没问题。不覆写EventTrigger,而是直接实现相应的接口,就没问题。比如做一个简单 scrollview,其中scrollRect组件控制了,子物体的移动,如果同时要实现子物体点击事件。如果直接用EventTrigger,会拦截scrollRect的拖动事件。但是实现 IPointerClickHandler就没问题,感觉eventTrigger 做了特殊处理。

      • 这是因为EventTrigger继承了IDragHandler接口,也就是说按钮自己可以接收到onDrag回调,但是又没写处理,所以在ScrollRect下的按钮上面拖动是没反应的。

  5. MOMO大大,刚刚我看了下unity内UnityEventBase类,其中AddListerner方法时私有的,也就是我们调用的button.onClick.AddListener()并不是新的Button的AddListener,而是老GUI中的。如果你有空可以看下。 void Start () { Button btn = gameObject.GetComponent(); btn.onClick.RemoveAllListeners(); btn.onClick.AddListener(OnClick); } public void OnClick() { Debug.Log(“button===========”); }这个样子的话 是可以动态添加Button的响应事件的。效率会不会很差?

    • 是的,我也碰到了。但是用momo大神以前的代码貌似就没问题。不覆写EventTrigger,而是直接实现相应的接口,就没问题。比如做一个简单 scrollview,其中scrollRect组件控制了,子物体的移动,如果同时要实现子物体点击事件。如果直接用EventTrigger,会拦截scrollRect的拖动事件。但是实现 IPointerClickHandler就没问题,感觉eventTrigger 做了特殊处理。

      • 我的方案就是不用EventTriggerListener,直接用obj.GetComponent().onClick.AddListener(delegate() { this.ClickJJCObj(jjc_obj); });注册button的点击事件

  6. 我就在想能不能 NGUI一样 在Eidter里面对MOMO老大写的这个进行改写,然后在编辑界面出现编辑选项,然后用gameobject.sendmessage 的消息函数来发消息,这样就原生的NGUI的方式一样了,而且编辑起来也容易得多。

  7. 我尝试了你的方法第一次不成功,每格方法前面要加override然后就可以了。我想问下,我现在要动态生成一个背包,里面有10-50个按钮名字都一样,我该如何识别按的按钮了

    • 是要加 override 。我已经补充进去了。 你的每一个格子对应一个 item类。。在类里记录你每个格子的属性。。 点击按钮的时候 通过ID取到对应的格子类。。

  8. MOMO 老大 UGUI研究院之控件以及按钮的监听事件系统(五) - 雨松MOMO程序研究院 - 1 我用UGUI做背包的时候,放在手机上, 点击物品,很容易就会变成移动事件,而不是点击事件,就是说点击不敏感,然后滑动太敏感,搞得手感很差。。。我想了好久,不知道怎么解决这个问题(555),您有空能帮我想想吗?

  9. 雨松大大问个问题,我在Scene窗口里设置我的UI object比如占整个panel的一半大,为什么运行的时候我的UI object 不会随着screen的增大而增大,而是大小不变就占了一小块,怎么使比例固定啊

  10. 感觉和NGUI差不多啊! 试了一下button: onEnter>onSelected>onDown>onUp>onClick>onExit>onUpdateSelected(一直触发,不知道有什么用)还可以加上所有其他UI事件ISubmitHandle(类似NGUI的 onSubmit)r,IDragHandler,IDropHandler,IDeselectHandler,IBeginDragHandler等等等NGUI的EventDelegate事件管理 不知道UGUI写了没有··

  11. 你的方式似乎麻烦了些,如果要监听处理某个ui点击,我会这样写:using UnityEngine;using UnityEngine.EventSystems;public class ClickTrigger : MonoBehaviour, IPointerClickHandler{ public void OnPointerClick(PointerEventData eventData) { Debug.Log(“click”); }}然后这样子直接挂给某个ui,该ui就可以处理点击事件了.题外话,UGUI也有提供EventTrigger组件可以使用,大概类似你的思路,但可以直接在editor上拖曳设定