triggerevent
前言
UGUI中EventSystem主要负责处理输入、射线以及发送事件,一个场景中
只能有一个EventSystem并且需要 BaseInputModule类型组建的协助才
能工作。
EventSystem负责管理,BaseInputModule负责输 入,BaseRaycaster负责确定目标对象。
UGUI中不仅可以对UI进行监测,还可以对场景中的对象进 行监测,以下会
有详细介绍
需要引入的空间名
using UnityEngine.EventSystems;
using UnityEngine.Events;
一、standaloneInputModule和TouchInoutModule两个组件会监测一些输入操作,以事件的方式通知目标对象,支持的事件有以下:
- 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
- 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,选择对应的类,对应的方法
一般来说,这样做不易于维护,查找比较费劲。主要是用代码的形式添加
三、使用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);
相关阅读
的确,必须没事找事,作为运营,你奏需要这么干。有一些事件我们很有必要熟知,总有一款会启发您。尝试归纳事件营销中具备二次传播基因的
1、主要作用 自动触发控件的点击事件2、界面的布局文件 activity_main.xml<RelativeLayout xmlns:android="http://schemas.and
最近大家都发现一个大问题,B站番剧页面黑白了。那么B站番剧页面黑白是怎么回事,今天小编就来给大家说说B站番剧页面黑白事件吧。7月
Java——事件处理机制监听者基础(一)动作监听ActionList
介绍:ActionListener是一个接口,ActionEvent通常在点击一个按钮或双击某个列表项或选中某个菜单时发生。如何设置监听:对监听者添加A
入口页设置 情景一:小程序初始化页面 根目录下的app.json文件中,控制pages数组,设置在第一行的页面就是默认启动页面例如下面的设置