射线检测、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...");
}
}
}
}