1、unity 之UGUI 屏蔽鼠标(射线)穿透
方法一
/// <summary>
/// 检测是否点击在UI上
/// </summary>
/// <returns></returns>
private bool IsClickUI()
{
if (EventSystem.current != null)
{
PointerEventData eventData = new PointerEventData(EventSystem.current);
eventData.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, results);
return results.Count > 0;
}
return false;
}
方法二
private void OnMouseDown()
{
// 如果点击的是 UI 元素,不执行后续逻辑
if (IsPointerUI())
{
// 点击的是 UI 元素,不做处理
return;
}
//下面执行对应点击逻辑
}
private bool IsPointerUI()
{
// 创建 pointerEventData
PointerEventData pointerEventData = new PointerEventData(EventSystem.current)
{
position = Input.mousePosition // 获取鼠标位置
};
// 存储所有 UI 元素的射线结果
var results = new List<RaycastResult>();
// 检查与 UI 的交互
EventSystem.current.RaycastAll(pointerEventData, results);
// 如果有结果证明鼠标在 UI 上
return results.Count > 0;
}
方法三
List<RaycastResult> RaycastResults = new List<RaycastResult>();
private bool IsMouseUI(Vector3 mousePos)
{
var ray = Camera.main.ScreenPointToRay(mousePos);
var ColliderDistance = float.MaxValue;
Transform raycastTarget = null;
if (Physics.Raycast(ray, out var raycastResult, 10000))
{
raycastTarget = raycastResult.transform;
ColliderDistance = raycastResult.distance;
}
if (EventSystem.current != null)
{
PointerData.position = Input.mousePosition;
if (RaycastResults.Count > 0)
RaycastResults.Clear();
EventSystem.current.RaycastAll(PointerData, RaycastResults);
for (int i = 0; i < RaycastResults.Count; i++)
{
if (RaycastResults[i].distance < ColliderDistance)
{
return true;
}
}
}
return false;
}
2、射线交互多个物体 Physics.RaycastNonAlloc
private RaycastHit[] Raycasts = new RaycastHit[10];
private void RayObject()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
for (int i = 0; i < Raycasts.Length; i++)
{
Raycasts[i].distance = 999;
};
int count = Physics.RaycastNonAlloc(ray, Raycasts);
if (count > 0)
{
//for (int i = 0; i < count; i++)
//{
// var hit = Raycasts[i];
// OnRayClick(hit.transform