Unity——点击按钮或屏幕响应事件

有时我们需要点击屏幕实时响应某事件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”颜色为黑色:

放开恢复成白色。

猜你喜欢

转载自blog.csdn.net/Ro969668074/article/details/81362727