日常开发中,经常需要用到模型的鼠标点击检测功能,有时候需要避免在进行界面操作时误点到界面后的模型,所以需要对鼠标落点是否在界面上进行一个检测。
PC端 鼠标点击检测:
public void OnMouseDown()
{
if (EventSystem.current.IsPointerOverGameObject())
{
Debug.Log("鼠标点击了UI");
return;
}
}
上面的方法如果不起作用的话可以等鼠标进入UI面板后先进行一个检测;
//定义一个UI面板
public GameObject UiPanel;
EventTriggerListener.Get(UiPanel).onEnter += (go) =>
{
Debug.Log("鼠标进入了面板");
};
EventTriggerListener.Get(UiPanel).onExit += (go) =>
{
Debug.Log("鼠标离开了面板");
};
需要使用到的代码放入工程资源内:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger
{
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
public VoidDelegate onDown;
public VoidDelegate onEnter;
public VoidDelegate onExit;
public VoidDelegate onUp;
public VoidDelegate onSelect;
public VoidDelegate onUpdateSelect;
public VoidDelegate onSub;
static public EventTriggerListener Get(GameObject go)
{
EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
if (listener == null) listener = go.AddComponent<EventTriggerListener>();
return listener;
}
public override void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick(gameObject);
}
public override void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject);
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onEnter != null) onEnter(gameObject);
}
public override void OnPointerExit(PointerEventData eventData)
{
if (onExit != null) onExit(gameObject);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (onUp != null) onUp(gameObject);
}
public override void OnSelect(BaseEventData eventData)
{
if (onSelect != null) onSelect(gameObject);
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (onUpdateSelect != null) onUpdateSelect(gameObject);
}
public override void OnSubmit(BaseEventData eventData)
{
if (onSub != null) onSub(gameObject);
}
}
手机端:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
void Update()
{
if (Input.GetMouseButtonDown(0)||(Input.touchCount >0 && Input.GetTouch(0).phase == TouchPhase.Began))
{
#if IPHONE || ANDROID
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
#else
if (EventSystem.current.IsPointerOverGameObject())
#endif
Debug.Log("当前触摸在UI上");
else
Debug.Log("当前没有触摸在UI上");
}
}
}