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;
        }
    }

}

参考链接:https://www.cnblogs.com/suoluo/p/6094554.html

posted @ 2024-05-16 21:16  枫亦  阅读(68)  评论(0)    收藏  举报