一.EventSystem简介

  用于处理事件的分发和相应的系统,创建画布的同时会创建事件系统

二.UGUI实现事件系统的3种方式

1.使用组件eventTrigger(不推荐),拖动赋值

2.代码添加enentTrigger组件,添加监听的方式

    private int _index;
// Start is called before the first frame update
void Start()
{
//添加trigger组件
EventTrigger trigger = gameObject.AddComponent<EventTrigger>();
//初始化一个事件列表
trigger.triggers = new List<EventTrigger.Entry>(); //定义绑定类型
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerClick;
//添加事件监听方法
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) => ChangeColor()); //添加的方法必须带有基础数据参数data,目前data为空 //将entry添加到trigger上去
trigger.triggers.Add(entry);
} //供注册使用的方法
public void ChangeColor()
{
if(_index == 0)
{
GetComponent<Image>().color = Color.blue;
}
else
{
GetComponent<Image>().color = Color.red;
}
_index = _index == 0 ? 1 : 0;
}

可以看到,Entry和TriggerEvent都是EventTrigger组件中的内部类,对应着绑定事件的类型和监听方法,Entry类中含有TriggerEvent类型的变量名称是callback。在添加好事件的类型和回调方法后将entry添加到EventTrigger的事件列表triggers上去。下面是源码中EventTrigger的代码:

namespace UnityEngine.EventSystems
{
[AddComponentMenu("Event/Event Trigger")]
public class EventTrigger : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IInitializePotentialDragHandler, IBeginDragHandler, IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler, ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler
{
protected EventTrigger(); public List<Entry> triggers { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Please use triggers instead (UnityUpgradable) -> triggers", true)]
public List<Entry> delegates { get; set; } public virtual void OnBeginDrag(PointerEventData eventData);
public virtual void OnCancel(BaseEventData eventData);
public virtual void OnDeselect(BaseEventData eventData);
public virtual void OnDrag(PointerEventData eventData);
public virtual void OnDrop(PointerEventData eventData);
public virtual void OnEndDrag(PointerEventData eventData);
public virtual void OnInitializePotentialDrag(PointerEventData eventData);
public virtual void OnMove(AxisEventData eventData);
public virtual void OnPointerClick(PointerEventData eventData);
public virtual void OnPointerDown(PointerEventData eventData);
public virtual void OnPointerEnter(PointerEventData eventData);
public virtual void OnPointerExit(PointerEventData eventData);
public virtual void OnPointerUp(PointerEventData eventData);
public virtual void OnScroll(PointerEventData eventData);
public virtual void OnSelect(BaseEventData eventData);
public virtual void OnSubmit(BaseEventData eventData);
public virtual void OnUpdateSelected(BaseEventData eventData); public class TriggerEvent : UnityEvent<BaseEventData>
{
public TriggerEvent();
}
public class Entry
{
public EventTriggerType eventID;
public TriggerEvent callback; public Entry();
}
}
}

从源码中也可以发现,EventTrigger本质上是通过接口的方式实现的事件,可以理解为这个类是对事件接口实现事件的方式的封装类。

3.使用接口

观察上方的EventTrigger的源码,可以发现实现了非常多的接口,这些接口就是事件接口:

public class EventTrigger : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IInitializePotentialDragHandler, IBeginDragHandler, IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler, ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler

这些接口的方法的实现:

下面我们分类介绍这些接口

拖动事件的接口:(值得注意的是,没有IDragHandler接口其他3个接口的实现方法不会被执行,因此必须继承IDragHandler接口)

IInitializePotentialDragHandler:初始化拖动事件,初始化时执行一次

IBeginDragHandler:开始拖动时执行一次

IDragHandler:拖动的过程中不断执行

IEndDragHandler:结束拖动时执行一次

放下事件的接口:(同样的,要想IDropHandler接口的方法被执行,必须同时实现IDragHandler)

IDropHandler:在物体拖动后被放下时执行一次

鼠标指针事件的接口:(一次鼠标点击,可以触发down、up、click3个事件,事件执行顺序也是down、up、click)

IPointerClickHandler:物体接受点击时执行一次

IPointerEnterHandler:鼠标指针进入物体范围时执行一次

IPointerExitHandler:鼠标指针移除物体范围时执行一次

IPointerDownHandler:鼠标按下时执行一次

IPointerUpHandler:鼠标抬起时执行一次

选中事件的接口:

ISelectHandler:物体被选中时执行一次

IUpdateSelectedHandler:物体是被选中状态不断执行

IDeselectHandler:物体结束选中状态时执行一次

按键事件的接口:

IScrollHandler:鼠标的滚轮滚动时执行

ISubmitHandler:提交键按下时执行

ICancelHandler:取消键按下后执行

IMoveHandler:方向键等按下后执行

三.接口的方法参数类型PointerEventData

下面是这个类的源码:

public class PointerEventData : BaseEventData
{
public List<GameObject> hovered; public PointerEventData(EventSystem eventSystem); public GameObject pointerPress { get; set; }
public Camera pressEventCamera { get; }
public Camera enterEventCamera { get; }
public InputButton button { get; set; }
public bool dragging { get; set; }
public bool useDragThreshold { get; set; }
public Vector2 scrollDelta { get; set; }
public int clickCount { get; set; }
public float clickTime { get; set; }
[Obsolete("Use either pointerCurrentRaycast.worldNormal or pointerPressRaycast.worldNormal")]
public Vector3 worldNormal { get; set; }
[Obsolete("Use either pointerCurrentRaycast.worldPosition or pointerPressRaycast.worldPosition")]
public Vector3 worldPosition { get; set; }
public Vector2 pressPosition { get; set; }
public Vector2 delta { get; set; }
public Vector2 position { get; set; }
public int pointerId { get; set; }
public bool eligibleForClick { get; set; }
public RaycastResult pointerPressRaycast { get; set; }
public RaycastResult pointerCurrentRaycast { get; set; }
public GameObject pointerDrag { get; set; }
public GameObject rawPointerPress { get; set; }
public GameObject lastPress { get; }
public GameObject pointerEnter { get; set; } public bool IsPointerMoving();
public bool IsScrolling();
public override string ToString(); public enum InputButton
{
Left = 0,
Right = 1,
Middle = 2
}
public enum FramePressState
{
Pressed = 0,
Released = 1,
PressedAndReleased = 2,
NotChanged = 3
}
}

可以看到,这个类是用于记录事件信息如拖动距离、是否拖动、输入的键信息等的对象模板。

UI中的事件系统EventSystem的更多相关文章

  1. ASP.NET Core 在 Swagger UI 中显示自定义的 Header Token

    Swagger 是个好东西,对于前后端分离的网站来说,不仅是提高前后端开发人员沟通效率的利器,也大大方便了后端人员测试 API.有时候,API 中可能需要在 Header 中设置认证参数,比如 aut ...

  2. Hbase源码分析:Hbase UI中Requests Per Second的具体含义

    Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...

  3. 关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题

    有时候会发现 Unity UI 非常耗时,在 Profiler 中可以轻易的看到 UI 中 的 GraphicRaycaster.Raycast 单帧调用可以成百上千,甚至好几千,帧速率前不忍赌,一关 ...

  4. kendo ui中grid页面参数问题

    kendo ui 中grid 算是最长用的控件之一,当使用分页效果时,我们要传递分页参数与自己定义的参数如: var dataSource = new kendo.data.DataSource({ ...

  5. Semantic UI中的验证控件的事件的使用

    1.Semantic UI中的验证控件,功能挺不错的,中文官网的文档写的都比较详细了,我再这里就不再进行重复了,主要是想说一下它的事件的使用方法,这个可能有部分朋友刚开始接触的时候不太了解 注意看这几 ...

  6. android 在你的UI中显示Bitmap - 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Displaying Bitmaps in Your UI 在你的UI中显示Bitmap ...

  7. jquery ui中 accordion的问题及我的解决方法

    原文:jquery ui中 accordion的问题及我的解决方法 jquery有一套所谓的ui组件,很不错的.如果有兴趣的朋友,可以参考http://jqueryui.com/ 但其中的accord ...

  8. Element UI 中组件this.$message报错

    最近在做毕设的时候,用Element UI中的消息提示message一直报以下的错误: 展示的效果也不好看,没有图标什么的: 但我明明有在main.js引入了element-ui 呀,因为毕设时间很赶 ...

  9. 关于Element UI中页面样式小问题

    一,修改组件dialog窗口的大小 二,在我使用upload组件上传一张美女图片时,发现当预览图片时,图片是灰色的,点击一下才会变亮,这种效果使我很不舒服,于是我通过添加下面的一条样式,问题解决了(可 ...

随机推荐

  1. try catch finally语句块中存在return语句时的执行情况剖析

    2种场景 (1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return; 场景代码分析(idea亲测) 场 ...

  2. 学习记录——使用PHP实现数据增删查改等基本功能(前后端分离)

    萌新初次学习服务器端语言,分享学习经验 实现功能:1.显示数据表    2.对数据进行分页    3.对数据进行增删查改 由于本萌新采用前后端完全分离方案,所以数据传输用的ajax,为了提高代码的复用 ...

  3. Vue 组件内滚动条 滚到到底部

    因为在vue中,某个组件内 使用scrollTop赋值 滚动条没有变化 使用scrollTo 也不行(window.scorllTo 或者dom.scrollTo) 所以可以考虑使用投机取巧的办法: ...

  4. 面试官:你真的了解Redis分布式锁吗?

    什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...

  5. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  6. linux中常用服务的安装

    安装环境:centos7.5 配置离线yum源参考:https://blog.csdn.net/mayh554024289/article/details/54236336vi /etc/yum.co ...

  7. CTFHub - Web(三)

    密码口令: 弱口令: 1.随意输入账号密码,抓包, 2.右击,"Send to Intruder",打开选项卡Intruder,点击position,椭圆框处软件已经自动为我们把要 ...

  8. fileinput模块用法

    fileinput模块功能: 提供拼接一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行,从而进行逐行处理(如进行显示.替换.添加行号等). 其功能类似于linux命令的 ...

  9. centos7虚拟机开启端口后 外部不能访问的问题

    转载 https://blog.csdn.net/u012045045/article/details/104219823 虚拟机新开了5005端口,系统内部是显示开了的(wget 192.168.4 ...

  10. tail -f 在对文件进行动态追踪时失效的问题

    在我是用 tail -f file.txt 对这个文件进行动态追踪时: 我重新打开一个新的终端进行vim编辑这个文件并且保存 这是我们发现,tail -f file.txt'动态追踪的这个文件没有任何 ...