Unity中当使用了UnityEngine.Ray或Input.Touch,会遇到UI层和3D物体层重叠的问题。通过UnityEngine.EventSystems,可以检测UI点击,屏蔽3D Collider的干扰。
基础方法
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class UIBlock : MonoBehaviour
{
void Update ()
{
if (EventSystem.current.IsPointerOverGameObject())
{
Debug.Log("是UI");
return;
}
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (hit.transform.gameObject.tag != "Untagged")
{
Debug.Log(hit.transform.name);
}
}
}
}
}
扩展方法
EventSystem.current.IsPointerOverGameObject() 括号内填写参数fingerId,不填默认指向左键。这个方法用于在移动端上处理以上问题。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class TouchExample : MonoBehaviour
{
void Update()
{
// Check if there is a touch
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
// Check if finger is over a UI element
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
{
Debug.Log("Touched the UI");
}
}
}
}
这样就能保证我们点击的是UI了。