unity 判断点击的是ui还是模型
射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI。但无论Physics2D.Raycast()还是Physics.Raycast()都只能检测到含有Collider组件的物体,普通UI如Image Button等一般用射线是不起作用的。EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个PointerEventData参数传入检测的点坐标
代码如下:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class TestScript: MonoBehaviour
{
void Start()
{
}
void Update()
{
//检测鼠标左键点击后抬起
if (Input.GetMouseButtonUp(0))
{
//根据传入的检测点位置,判断是否点击到UI
if (IsOnUI(Input.mousePosition))
{
Debug.Log("点击了UI");
}
else
{
// 获得鼠标位置,转成射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 场景碰撞检测,Raycast还有第四个参数是layer mask,可用来过滤物体
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 1000f))
{
Debug.Log(hit.transform.name);
}
}
}
}
/// <summary>
/// 检测是否点击在UI上
/// </summary>
/// <param name="pos">检测的点坐标</param>
/// <returns></returns>
bool IsOnUI(Vector2 pos)
{
//通过当前场景中活跃的EventSystem实例,获取输入事件的数据
PointerEventData pointerData = new PointerEventData(EventSystem.current);
//设置检测的点坐标
pointerData.position = pos;
//检测到的对象列表
List<RaycastResult> results = new List<RaycastResult>();
//传入的点坐标检测到的所有物体填充到列表
EventSystem.current.RaycastAll(pointerData, results);
//如果没检测到任何物体则返回false
if (results.Count < 1) return false;
else
{
//检测到了的第一个物体的layer为UI,则代表检测到了UI,返回true
if (results[0].gameObject.layer == LayerMask.NameToLayer("UI")) return true;
//反之检测不是UI,返回false
else return false;
}
}
}

浙公网安备 33010602011771号