UGUI中EventSystem主要负责处理输入、射线以及发送事件,一个场景中
只能有一个EventSystem并且需要 BaseInputModule类型组建的协助才
能工作。
EventSystem负责管理,BaseInputModule负责输 入,BaseRaycaster负责确定目标对象。
UGUI中不仅可以对UI进行监测,还可以对场景中的对象进 行监测,以下会
有详细介绍
需要引入的空间名
using UnityEngine.EventSystems;
using UnityEngine.Events;
使用方式:
1. 引入命名空间 using UnityEngine.EventSystems;
2. 使用某个方法就继承某个接口
3. 根据方法的参数使用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
///
/// Button a.
/// UGUI处理其他类型事件的方式一:接口
///
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. 触碰到那个,需要进行测试,尤其是对于组合的物体,它会是触碰到某个子物体,还是指代完整的父物体?
先创建一个ButtonB UI对象,然后创建脚本, 拖给ButtonB
以下是脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// Button b.
/// UGUI处理其它类型事件的方式二:拖拽
///
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类实际是一个类,里面包含一个字段,一个属性,多个虚方法和二个内置类
其中具体的可以从API中读一读
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
///
/// Button c.
/// UGUI处理其它类型事件的方式三:代码添加
///
public class ButtonC : MonoBehaviour {
EventTrigger trigger;
void Start(){
//1, 给需要的物体添加事件的组件EventerTrigger
trigger = GetComponent ();
if (trigger == null) {
trigger = gameObject.AddComponent ();
}
//2.初始化EventTrigger.Entry容器
trigger.triggers = new List();
//实例化一个EventTrigger.Entry对象
EventTrigger.Entry enter = new EventTrigger.Entry ();
//根据方法需要的参数依次写
//3.指定事件触发的类型
enter.eventID = EventTriggerType.PointerEnter;
//4.指定事件触发的方法
enter.callback = new EventTrigger.TriggerEvent ();
//5.需要添加命名空间using UnityEngine.Events;,并传入一个要调用的方法名称,这句可以先写,因为这里初始化只需要一个待调用的方法
UnityAction action = new UnityAction (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 ();
if (ET == null) {
ET = obj.AddComponent ();
}
if (trigger.triggers.Count == 0) {
trigger.triggers = new List ();
}
UnityAction callBack = new UnityAction (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);