有时我们需要点击屏幕实时响应某事件A,但当需要点击某个按钮响应另一事件B时,也同样会带动A的响应,而我们不想A响应,此时就需要我们判断区分一下,那么就需要实时监听鼠标或手指点击的是按钮还是屏幕了。
创建一个脚本“ButtonEventTrigger”,将其挂在“Canvas”上,如图所示:
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ButtonEventTrigger : MonoBehaviour {
private Button _button;
public bool m_bool;//鼠标划入Button区域时为true
void Start () {
_button = this.transform.Find("Button").GetComponent<Button>();
_button.onClick.AddListener(delegate() { ClickButton(); });
MonitorMouse(_button);
MonitorMouse1(_button);
}
void Update () {
if (!m_bool)
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("点击屏幕");
}
}
if (m_down)
{
_button.gameObject.GetComponent<Image>().color = new Color(0, 0, 0, 1);//鼠标按下,Button呈黑色
}
else
{
_button.gameObject.GetComponent<Image>().color = new Color(1, 1, 1, 1);//鼠标放开,Button呈白色
}
}
#region 鼠标移入移出
public void MonitorMouse(Button btn)
{
btn.gameObject.AddComponent<EventTrigger>();
EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
// 鼠标移入事件
entry.eventID = EventTriggerType.PointerEnter;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(OnMouseEnter);
trigger.triggers.Add(entry);
// 鼠标移出事件
EventTrigger.Entry entrys = new EventTrigger.Entry();
entrys.eventID = EventTriggerType.PointerExit;
entrys.callback = new EventTrigger.TriggerEvent();
entrys.callback.AddListener(OnMouseOut);
trigger.triggers.Add(entrys);
}
private void OnMouseEnter(BaseEventData pointData)
{
m_bool = true;
}
private void OnMouseOut(BaseEventData pointData)
{
m_bool = false;
}
#endregion
#region 鼠标点击放开
public void MonitorMouse1(Button btn)
{
btn.gameObject.AddComponent<EventTrigger>();
EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
// 鼠标点击按下事件
entry.eventID = EventTriggerType.PointerDown;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(OnMouseDown);
trigger.triggers.Add(entry);
// 鼠标放开事件
EventTrigger.Entry entrys = new EventTrigger.Entry();
entrys.eventID = EventTriggerType.PointerUp;
entrys.callback = new EventTrigger.TriggerEvent();
entrys.callback.AddListener(OnMouseUp);
trigger.triggers.Add(entrys);
}
private bool m_down = false;
private void OnMouseDown(BaseEventData pointData)
{
m_down = true;
}
private void OnMouseUp(BaseEventData pointData)
{
m_down = false;
}
#endregion
void ClickButton()
{
Debug.Log("点击按钮");
}
}
当鼠标划入“Button”区域时,m_bool为true,此时点击,响应输出:
点击非“Button”区域,即屏幕时,响应输出:
鼠标点击“Button”且不放开,“Button”颜色为黑色:
放开恢复成白色。
以上为方法一。方法二相对更简单些,只需判定对象是否具有Button属性。
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.currentSelectedGameObject != null)
{
Debug.Log("点击的是Button:" + EventSystem.current.currentSelectedGameObject.name);
}
else
{
Debug.Log("点击的是屏幕(非Button属性的)");
}
}
}
当点击某个Button后,EventSystem.current.currentSelectedGameObject会一直是此Button对象,点击空白处才会为null;然而有时点击空白是多余的,就需要在该Button调用的方法中添加“EventSystem.current.SetSelectedGameObject(null);”相当于点击空白。