继续学习,我相信大家在做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差不多呢? 这里我给大家引一个思路,把下面代码放在你的项目里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger{ public delegate void VoidDelegate (GameObject go); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect; static public EventTriggerListener Get (GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; } public override void OnPointerClick(PointerEventData eventData) { if(onClick != null) onClick(gameObject); } public override void OnPointerDown (PointerEventData eventData){ if(onDown != null) onDown(gameObject); } public override void OnPointerEnter (PointerEventData eventData){ if(onEnter != null) onEnter(gameObject); } public override void OnPointerExit (PointerEventData eventData){ if(onExit != null) onExit(gameObject); } public override void OnPointerUp (PointerEventData eventData){ if(onUp != null) onUp(gameObject); } public override void OnSelect (BaseEventData eventData){ if(onSelect != null) onSelect(gameObject); } public override void OnUpdateSelected (BaseEventData eventData){ if(onUpdateSelect != null) onUpdateSelect(gameObject); } } |
然后在你的界面里面写入监听按钮的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; public class UIMain : MonoBehaviour { Button button; Image image; void Start () { button = transform.Find("Button").GetComponent<Button>(); image = transform.Find("Image").GetComponent<Image>(); EventTriggerListener.Get(button.gameObject).onClick =OnButtonClick; EventTriggerListener.Get(image.gameObject).onClick =OnButtonClick; } private void OnButtonClick(GameObject go){ //在这里监听按钮的点击事件 if(go == button.gameObject){ Debug.Log ("DoSomeThings"); } } } |
虽然还有一些别的监听方式,但是我觉得这种方式是最科学的,大家可根据自己项目的需求继续拓展EventTriggerListener类。
- 本文固定链接: https://www.xuanyusong.com/archives/3325
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
能把拖动和滚动的在扩展下吗 像NGUI一样
能不能系统的讲下EventSystem InputModule 和 Raycast
有时间了我整理一下, 不过这块我觉得可以直接看看源码。。。
UGUI的button没什么没有碰撞体
因为它不是用collier 来判断碰撞的。。。
那多边形的按钮岂不是有很大的误识别区域
这种按钮就要特殊处理了,, 不过这种按钮很少见吧。。
新手问一下,具体该怎样操作,把脚本添加到哪里?
大大,用这套监听之后interactable = false 还是能接收到点击事件,怎么破。。。
我也遇到了
你有解决吗
+1,按钮会变灰色,但是仍然能响应
解决了没大兄弟
1,按钮会变灰色,但是仍然能响应
很正常啊,interactable是Button组件的属性,不是EventTrigger组件的属性
button双击响应事件要怎么做呢?大神。
在update里面写逻辑判断吧。。。
用这个方法会在连续快速点击多个按钮的时候一些按钮无法响应,雨大遇到没
如果我要一个全局的滑动事件,比如切水果,怎么做?
这种用Input会好一点
MOMO你好,你着个方法有BUG 比如我在一个物体上加了拖动功能,用你的着个方法给物体加OnClick事件 那拖动就失效了
是的,我也碰到了。但是用momo大神以前的代码貌似就没问题。不覆写EventTrigger,而是直接实现相应的接口,就没问题。比如做一个简单 scrollview,其中scrollRect组件控制了,子物体的移动,如果同时要实现子物体点击事件。如果直接用EventTrigger,会拦截scrollRect的拖动事件。但是实现 IPointerClickHandler就没问题,感觉eventTrigger 做了特殊处理。
这是因为EventTrigger继承了IDragHandler接口,也就是说按钮自己可以接收到onDrag回调,但是又没写处理,所以在ScrollRect下的按钮上面拖动是没反应的。
不是应该加拖动事件为啥加click事件呀
EventTriggerListener 里面继承各个事件响应接口不继承EventTrigger 就行了
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的响应事件的。效率会不会很差?
这样也可以。。。 效率不会差。。
scrollrect 製作簡易功能 按鈕跟拖曳之間,監聽異常似乎是 eventtrigger eventsystem 之間的問題
亲,有解决办法吗?求赐教啊!
是的,我也碰到了。但是用momo大神以前的代码貌似就没问题。不覆写EventTrigger,而是直接实现相应的接口,就没问题。比如做一个简单 scrollview,其中scrollRect组件控制了,子物体的移动,如果同时要实现子物体点击事件。如果直接用EventTrigger,会拦截scrollRect的拖动事件。但是实现 IPointerClickHandler就没问题,感觉eventTrigger 做了特殊处理。
不太清楚, 我重写了scrollRect组件。。
我也碰到了有方法解决吗
我的方案就是不用EventTriggerListener,直接用obj.GetComponent().onClick.AddListener(delegate() { this.ClickJJCObj(jjc_obj); });注册button的点击事件
我就在想能不能 NGUI一样 在Eidter里面对MOMO老大写的这个进行改写,然后在编辑界面出现编辑选项,然后用gameobject.sendmessage 的消息函数来发消息,这样就原生的NGUI的方式一样了,而且编辑起来也容易得多。
sendmessage不好。
大大能科普下吗
效率低,
额,谢谢大神,呵呵。
大大是啥
大大就是雨松的爱称
我尝试了你的方法第一次不成功,每格方法前面要加override然后就可以了。我想问下,我现在要动态生成一个背包,里面有10-50个按钮名字都一样,我该如何识别按的按钮了
是要加 override 。我已经补充进去了。 你的每一个格子对应一个 item类。。在类里记录你每个格子的属性。。 点击按钮的时候 通过ID取到对应的格子类。。
不规则按钮,要怎么做。
后来在博客里写了。。。
MOMO 老大
我用UGUI做背包的时候,放在手机上, 点击物品,很容易就会变成移动事件,而不是点击事件,就是说点击不敏感,然后滑动太敏感,搞得手感很差。。。我想了好久,不知道怎么解决这个问题(555),您有空能帮我想想吗?
雨松大大问个问题,我在Scene窗口里设置我的UI object比如占整个panel的一半大,为什么运行的时候我的UI object 不会随着screen的增大而增大,而是大小不变就占了一小块,怎么使比例固定啊
瞬间不想用NGUI了,原生的才是最好的啊
恩恩。。
感觉和NGUI差不多啊! 试了一下button: onEnter>onSelected>onDown>onUp>onClick>onExit>onUpdateSelected(一直触发,不知道有什么用)还可以加上所有其他UI事件ISubmitHandle(类似NGUI的 onSubmit)r,IDragHandler,IDropHandler,IDeselectHandler,IBeginDragHandler等等等NGUI的EventDelegate事件管理 不知道UGUI写了没有··
可以自己拓展上去。。
onUpdateSelected相当于WPF开发中的Focus状态,只要你选中就会一直触发
这个方式好,相当专业
哈哈。 都是NGUI过来的。。。
你的方式似乎麻烦了些,如果要监听处理某个ui点击,我会这样写:using UnityEngine;using UnityEngine.EventSystems;public class ClickTrigger : MonoBehaviour, IPointerClickHandler{ public void OnPointerClick(PointerEventData eventData) { Debug.Log(“click”); }}然后这样子直接挂给某个ui,该ui就可以处理点击事件了.题外话,UGUI也有提供EventTrigger组件可以使用,大概类似你的思路,但可以直接在editor上拖曳设定
1. 你的ClickTrigger 是要绑定在UI上。 可是一般处理界面 需要在一个脚本上处理所有的UI 2. EventTrigger 要指定一个方法。。。 代码里要写接收方法,这样很麻烦。3. 你可以看看 NGUI的 UIEventListener NGUI做项目的时候 都会这么搞。。 用代理是最方便了。。
每个很多UI元素下边不是有OnClick事件的吗?为啥还有自己写监听事件呢?
因为有些按钮 是运行时生成的。。。
也可以Button.onClick.AddListener