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”颜色为黑色:

放开恢复成白色。

以上为方法一。方法二相对更简单些,只需判定对象是否具有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);”相当于点击空白。

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值