Unity 射线检测 解决UI穿透

射线检测、UGUI解决UI穿透问题


转载自:http://blog.csdn.net/u014230923/article/details/51493382

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

最近在学习的过程中遇到一个问题,那就是当有 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 脚本,让点击正常:

EventSystem.current.IsPointerOverGameObject()  如果当前鼠标在 ui 上返回true 否则返回false
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...");
            }
        }
    }
}
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值