Unity中UGUI鼠标穿透UI问题的解决方法
不过在使用时需要先获取两个红色显示的变量,graphicRaycaster和eventSystem。
这两个变量分别对应的是Canvas中的GraphicRaycaster组件和创建UI时自动生成的“EventSystem”中的EventSystem组件。
引用
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine.UI;
private GraphicRaycaster graphicRaycaster;
private EventSystem eventSystem;
void Start()
{
graphicRaycaster = GameObject.Find("Canvas").GetComponent<GraphicRaycaster>();
eventSystem = GameObject.Find("EventSystem").GetComponent<EventSystem>();
}
// Update is called once per frame
void Update()
{
if (CheckGuiRaycastObjects()) return;//防止射线穿透UI界面
Debug.Log(EventSystem.current.gameObject.name);
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
//获取碰撞点的位置
if (hit.collider.name == "Terrain")
{
Debug.LogError(hit.collider.name);
}
}
}
}
bool CheckGuiRaycastObjects()
{
PointerEventData eventData = new PointerEventData(eventSystem);
eventData.pressPosition = Input.mousePosition;
eventData.position = Input.mousePosition;
List<RaycastResult> list = new List<RaycastResult>();
graphicRaycaster.GetComponent<GraphicRaycaster>().Raycast(eventData, list);
Debug.Log(list.Count);
return list.Count > 0;
}
第二种方式直接添加判断条件
EventSystem.current.IsPointerOverGameObject() //返回一个布尔值,进入了UI上就返回true。