UGUI 事件响应之EventSystem

原创 2015年07月06日 22:45:09

在Unity新的UI系统里,按照NGUI写了自己一套事件响应机制。

EventSystem官方描述(http://docs.unity3d.com/460/Documentation/Manual/EventSystem.html)如下:

EventSystem 是一种将基于输入的事件发送到应用程序中的对象,无论是键盘、 鼠标、 触摸或自定义输入。 EventSystem 由发送事件的几个组件共同组成。

Overview

当您将 EventSystem 组件添加到一个游戏对象上,你会发现它并没有多少暴露的功能时,这是因为 EventSystem 本身被设计为一个 manager and facilitator (管理和主持) EventSystem 模块之间的通信。

EventSystem 的主要作用是,如下所示:

• 管理被选中游戏对象

• 管理正在使用的 InputModule

• 管理 Raycasting (如果需要)

• 更新所需的所有 InputModules

Input Modules

输入的模块是 EventSystem 表现的主要逻辑怎样的,它们用于:

• 处理输入

• 管理事件的状态

• 将事件发送到场景物体。

在同一时间只有一个 InputModule 可以在 EventSystem 中处于活动状态,并且他们必须作为 EventSystem 组件的同一游戏物体上的组件。

Raycasters

Raycasters 用于发送确定 pointer 指针位于什么上方,对于 InputModules 使用Raycasters 这是常见的,场景配置中用于计算 pointing 设备是 over 。

有 3 种情况提供的 Raycasters 默认存在:

• GraphicRaycaster- 用于 UI 元素

• 2DPhysicsRaycaster- 用于为 2D 物理元素

• 3DPhysicsRaycaster- 用于为三维物理元素


EventSystem支持的事件包括很多种类型,他们都是以接口的形式存在,包括:

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

跟踪下代码可以看到EventTrigger组件是继承了上述各类借口。

在自己的代码里,添加一下类代码:

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;

public class EventTriggerListener : 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;

    public static 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);
    }
}

在调用处使用如下:

public class UController : 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 ("Click");
		}
	}
}

这样做的好处:

1.一般GameObject.GetComponet<Button>().onClick.AddListener(_callback);

这里_callback回掉函数是public delegate void Function();的形式,不能传参数,采用上述方式可以添加参数,在做ScrollView列表的时候可以找到具体某个Item;

2.这样做能对项目的Ui事件进行更有效的管理,功能丰富。


版权声明:本文为博主原创文章,未经博主允许不得转载。

UGUI学习——EventSystem

UGUI的EventSystem介绍 创建uGUI控件后,Unity会同时创建一个叫EventSystem的GameObject,用于控制各类事件。可以看到Unity自带了两个Input Modu...
  • lichaoguan
  • lichaoguan
  • 2015年03月24日 14:02
  • 1926

Unity3D之UGUI学习EventSystem

坚持 成长 每日一篇 Unity3D之UGUI学习EventSystem
  • u014410695
  • u014410695
  • 2015年08月27日 21:48
  • 3097

ugui 添加事件的几种方式

Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值。如下图所示:     先以PointerClick为例。这个是用于...
  • baidu_28955655
  • baidu_28955655
  • 2016年05月12日 20:49
  • 5632

UGUI点击事件的几种代码添加方式

说明: UGUI一般对Button等添加点击事件等时,往往会涉及到使用将脚本与Button相挂接的方式,今天介绍几种不需要挂接的方式,直接由代码与之产生相对应的效果。。。 方法一: 使用GetComp...
  • aiyan1111111
  • aiyan1111111
  • 2016年10月31日 23:16
  • 1737

UGUI_不规则图片点击事件处理

UGUI_不规则图片点击事件处理
  • sgnyyy
  • sgnyyy
  • 2015年12月08日 22:42
  • 1178

UGUI点击事件(委托)

using UnityEngine.UI; public class shi : MonoBehaviour {     GameObject[] btnss;     public GameO...
  • zdmqweasdzxc
  • zdmqweasdzxc
  • 2016年03月30日 10:12
  • 565

uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)

猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!原文地址: http://blog.csdn.net/cocos2der/article/details/42705885 ...
  • yanghuiliu
  • yanghuiliu
  • 2015年01月14日 11:24
  • 35557

[UnityUI]UGUI的事件系统

官方文档链接:http://docs.unity3d.com/460/Documentation/Manual/SupportedEvents.html Supported Events The Ev...
  • lyh916
  • lyh916
  • 2015年03月23日 21:37
  • 7757

Unity UGUI控件 OnValueChanged事件测试说明Demo

  • 2017年06月02日 18:03
  • 2.84MB
  • 下载

unity UGUI Toggle事件管理

unity ugui toggle的点击事件,需要的可以自己补充
  • ChinaDana
  • ChinaDana
  • 2016年04月01日 11:04
  • 7519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UGUI 事件响应之EventSystem
举报原因:
原因补充:

(最多只允许输入30个字)