Unity 解决点击 UI 穿透问题

来源:互联网 发布:办公软件表格 编辑:程序博客网 时间:2024/05/15 18:20

最近在学习的过程中遇到一个问题,那就是当有 ui 时如果你点击 ui,这时如果鼠标下面还有一些3d物体也有点击效果,这时候也会触发。这是一位点击的时候,鼠标“穿透”了。,但我们是不想要这种效果发生的。那我们该怎么办?
貌似 使用 NGUI 的话 有一个判断可以使用,利用 UICamera.hoveredObject 来判断,如果鼠标在 ui 上返回 true,否则返回 false。
但是,如果我们使用的 UGUI 的话,并没有这个方法。那我们也可以使用其他方法,UGUI 系统提供了更为简便的方法。好,现在我们就来测试一下。
我们先新建一个 Plane,然后给他添加一个 tag 为 plane。然后给摄像机添加一个叫做 MouseClick 的脚本:

using UnityEngine;using System.Collections;public class MouseClick : MonoBehaviour {    // Update is called once per frame    void Update () {        //如果左键按下        if (Input.GetMouseButtonDown(0))        {            Click();        }    }    void Click ()    {        //从主这相机到鼠标点发射一条射线        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);        //接受射线返回的碰撞信息        RaycastHit hitInfo;        //如果射线碰撞到东西        if (Physics.Raycast(ray, out hitInfo))        {            if (hitInfo.collider.tag == "plane")            {                Debug.Log("点击了Plane...");            }        }    }}

然后运行程序,当我们点击到 Plane 的时候就会打印日志了。
现在我们添加一个 Button 也给它添加一个 脚本 BtnClick:

using UnityEngine;using System.Collections;public class BtnClick : MonoBehaviour {    public void Click ()    {        Debug.Log("点击了按钮...");    }}

这里写图片描述

运行程序后,当我们点击 Plane 是正常打印日志的,但是,当我们点击按钮时,会发现 两个日志都打印了:

这里写图片描述

这时候,修改 MouseClick 脚本,让点击正常:

using UnityEngine;using System.Collections;using UnityEngine.EventSystems;public class MouseClick : MonoBehaviour {    // Update is called once per frame    void Update () {        //如果左键按下        if (Input.GetMouseButtonDown(0))        {            Click();        }    }    void Click ()    {        //从主这相机到鼠标点发射一条射线        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);        //接受射线返回的碰撞信息        RaycastHit hitInfo;        //如果射线碰撞到东西        //EventSystem.current.IsPointerOverGameObject()  如果当前鼠标在 ui 上返回true 否则返回false        if (Physics.Raycast(ray, out hitInfo) && !EventSystem.current.IsPointerOverGameObject())        {            if (hitInfo.collider.tag == "plane")            {                Debug.Log("点击了Plane...");            }        }    }}

现在运行程序,鼠标就不会穿透了。

工程地址:http://pan.baidu.com/s/1mhOKzR6 密码 suwt

1 0
原创粉丝点击