当前位置:首页 > IT技术

unity3D UGUI学习(五) EventSystem,EventTrigger响应事件介绍

时间:2019-06-07 19:41:02来源:IT技术作者:SEO探针小编阅读:109次「手机版」
 

triggerevent

前言

UGUI中EventSystem主要负责处理输入、射线以及发送事件,一个场景中

只能有一个EventSystem并且需要 BaseInputModule类型组建的协助才

工作

EventSystem负责管理,BaseInputModule负责输 入,BaseRaycaster负责确定目标对象。

UGUI中不仅可以对UI进行监测,还可以对场景中的对象进 行监测,以下会

有详细介绍

需要引入的空间

using UnityEngine.EventSystems;
using UnityEngine.Events;
一、standaloneInputModule和TouchInoutModule两个组件会监测一些输入操作,以事件的方式通知目标对象,支持的事件有以下:
  1. IPointerEnterhandler - OnPointerEnter - Called when a pointer enters the object
  2. IPointerExitHandler - OnPointerExit - Called when a pointer exits the object
  3. IPointerDownHandler - OnPointerDown - Called when a pointer is pressed on the object
  4. IPointerUpHandler - OnPointerUp - Called when a pointer is released (called on the original the pressed object)
  5. IPointerClickHandler - OnPointerClick - Called when a pointer is pressed and released on the same object
  6. IInitializePotentialDragHandler - OnInitializePotentialDrag - Called when a drag target is found, can be used to initialise values

使用方式:

1. 引入命名空间 using UnityEngine.EventSystems;

2. 使用某个方法就继承某个接口

3. 根据方法的参数使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// Button a.
/// UGUI处理其他类型事件的方式一:接口
/// </summary>
public class ButtonA : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerDownHandler,IPointerClickHandler{

    public void OnPointerEnter (PointerEventData eventData)
    {
        Debug.Log ("enter");
        //鼠标进入到那,就把进入到那的那个物体名输出
        Debug.Log (eventData.pointerEnter.name);
    }

    public void OnPointerExit(PointerEventData eventData){
        Debug.Log ("exit");
    }
    //按下就触发
    public void OnPointerDown(PointerEventData eventData){
        Debug.Log ("down");
        //Debug.Log (eventData.pointerPress.name); eventData.pointerPress.name该值只能写一个、不能重复写
    }

    //鼠标点击完成(按下,抬起)触发 ,如果按下的时候在别的地方抬起,则不会触发
    public void OnPointerClick(PointerEventData eventData){
        Debug.Log ("click");
    }
}

注意的:

1. 可以同时继承多个接口,同时使用多个方法

2. 使用方式大致相同

3. 触碰到那个,需要进行测试,尤其是对于组合的物体,它会是触碰到某个子物体,还是指代完整的父物体?

二、以拖拽的方式添加事件方法给EventTrigger

先创建一个ButtonB UI对象,然后创建脚本, 拖给ButtonB

以下是脚本代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Button b.
/// UGUI处理其它类型事件的方式二:拖拽
/// </summary>
public class ButtonB : MonoBehaviour {

    public void PEnter(){
        Debug.Log ("PEnter");
    }
    public void PExit(){
        Debug.Log ("PExit");
    }
    public void PDown(){
        Debug.Log ("PDown");
    }
    public void PClick(){
        Debug.Log ("PClick");
    }

}

给ButtonB对象添加EventTrigger组件

然后把Button拖入EventTrigger,选择对应的类,对应的方法

2

一般来说,这样做不易于维护,查找比较费劲。主要是用代码的形式添加

三、使用EventTrigger类和脚本代码添加事件

EventTrigger类实际是一个类,里面包含一个字段,一个属性,多个虚方法和二个内置类

其中具体的可以从API中读一读

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

using UnityEngine.Events;
/// <summary>
/// Button c.
/// UGUI处理其它类型事件的方式三:代码添加
/// </summary>
public class ButtonC : MonoBehaviour {
    EventTrigger trigger;
    void Start(){
        //1, 给需要的物体添加事件的组件EventerTrigger
        trigger = Getcomponent<EventTrigger> ();

        if (trigger == null) {
            trigger = gameObject.AddComponent<EventTrigger> ();
        }

        //2.初始化EventTrigger.Entry容器
        trigger.triggers = new List<EventTrigger.Entry>();
        //实例化一个EventTrigger.Entry对象
        EventTrigger.Entry enter = new EventTrigger.Entry ();

        //根据方法需要的参数依次写
        //3.指定事件触发的类型
        enter.eventID = EventTriggerType.PointerEnter;
        //4.指定事件触发的方法
        enter.callback = new EventTrigger.triggerevent ();
        //5.需要添加命名空间using UnityEngine.Events;,并传入一个要调用的方法名称,这句可以先写,因为这里初始化只需要一个待调用的方法
        UnityAction<BaseEventData> action = new UnityAction<BaseEventData> (PEnter);

        //6.添加
        enter.callback.AddListener (action);
        trigger.triggers.Add (enter);
    }

    private void PEnter(BaseEventData pd){
        Debug.Log ("Penter");
    }
}

因为用代码写的步数操作较多,每写一个事件响应就要重复写,因此可以写一个函数工具

这个函数工具的参数有3个

1. 物体对象

2. 触碰类型

3. 触碰后调用的方法

例子
    private delegate void MyMehod(BaseEventData pd);

    private void addTriggersListener(GameObject obj, EventTriggerType eventTriggerType,MyMehod myMehod){
        EventTrigger ET = GetComponent<EventTrigger> ();
        if (ET == null) {
            ET = obj.AddComponent<EventTrigger> ();
        }
        if (trigger.triggers.Count == 0) {
            trigger.triggers = new List<EventTrigger.Entry> ();
        }

        UnityAction<BaseEventData> callBack = new UnityAction<BaseEventData> (myMehod);
        EventTrigger.Entry entry = new EventTrigger.Entry ();
        entry.eventID = eventTriggerType;
        entry.callback.AddListener (callBack);

        trigger.triggers.Add (entry);
    }

    private void myMehod(BaseEventData pd){
        Debug.Log (";-)");
    }   

//在Start调用该方法,传入类型即可 
addTriggersListener (gameObject, EventTriggerType.PointerClick, myMehod);

这里的使用的是list容器,所以对于不同类型的触碰方法可以叠加,方法也可以重复使用,功能十分强大

重复使用该工具方法:

        addTriggersListener (gameObject, EventTriggerType.PointerClick, myMehod);
        addTriggersListener (gameObject, EventTriggerType.PointerClick, PEnter);
        addTriggersListener (gameObject, EventTriggerType.PointerExit, PEnter);
        addTriggersListener (gameObject, EventTriggerType.PointerEnter, myMehod);

相关阅读

运营不可不知的“事件营销”经典案例

的确,必须没事找事,作为运营,你奏需要这么干。有一些事件我们很有必要熟知,总有一款会启发您。尝试归纳事件营销中具备二次传播基因的

view.performClick()触发点击事件

1、主要作用 自动触发控件的点击事件2、界面的布局文件  activity_main.xml<RelativeLayout xmlns:android="https://schemas.and

B站番剧页面黑白是怎么了?B站番剧页面黑白事件

最近大家都发现一个大问题,B站番剧页面黑白了。那么B站番剧页面黑白是怎么回事,今天小编就来给大家说说B站番剧页面黑白事件吧。7月

Java——事件处理机制监听者基础(一)动作监听ActionList

介绍:ActionListener是一个接口,ActionEvent通常在点击一个按钮或双击某个列表项或选中某个菜单时发生。如何设置监听:对监听者添加A

小程序初涉——入口页设置&事件绑定

入口页设置 情景一:小程序初始化页面 根目录下的app.json文件中,控制pages数组,设置在第一行的页面就是默认启动页面例如下面的设置

分享到:

栏目导航

推荐阅读

热门阅读