Unity3dUGUI鼠标穿透UI问题的解决方法

简介: 当我们使用UGUI的时候会经常遇到鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件。比如下图中:UGUI鼠标穿透问题解决那么这时候我们就需要解决这个棘手的问题了,其实也不难,只需要检测...

当我们使用UGUI的时候会经常遇到鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件。比如下图中:

img_c7855e3553a116b8a1f944ebdfddbc61.png
UGUI鼠标穿透问题解决
那么这时候我们就需要解决这个棘手的问题了,其实也不难,只需要检测鼠标是否点击在UI元素上就可以了,zero利用的是EventSystem(事件系统);
当然了,或许有些朋友不懂EventSystem.current.IsPointerOverGameObject()是什么,没关系,zero已经为你附上了unity官网的链接地址:
http://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.IsPointerOverGameObject.html
先搭建一个简单的场景,如下:
img_f2bf64f284cb23854ffb69860a1c564d.png
完成结果
下面就是我们的解决方法了:

完整版

    void Update()
    {
#if (UNITY_ANDROID || UNITY_IPHONE) && !UNITY_EDITOR
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {

            }
        }
#else
        if (Input.GetMouseButtonUp(0))
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {

            }
        }
#endif

    }

using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 脚本位于Canvas画布上
/// </summary>
public class PointerPenetrate : MonoBehaviour
{
    /// <summary>
    /// cube
    /// </summary>
    public GameObject cube;

    void Update()
    {
        //按下鼠标左键
        if (Input.GetMouseButtonDown(0))
        {
            //当前检测到的是否是UI层   
            if (EventSystem.current.IsPointerOverGameObject())
            {
                //是UI的时候,执行相关的UI操作
                Debug.Log("是UI");
            }
            else
            {
                //不是UI层的时候,执行其它操作
                Debug.Log("不是UI");

                //射线检测
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                //定义射线检测器
                RaycastHit hitInfo;

                if (Physics.Raycast(ray, out hitInfo))
                {
                    //如果当前射线检测到的对象的名字是cube
                    if (hitInfo.collider.name == "Cube")
                    {
                        //改变cube的颜色,随机一个颜色
                        cube.GetComponent<MeshRenderer>().material.color =
                            new Color(Random.value, Random.value, Random.value, 1.0f);
                    }
                }
            }
        }
       //【更新内容】安卓上判断是否点击在UI还是3D物体
        if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)

        {
            if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))

            {
                Debug.Log("Hit UI, Ignore Touch");
            }

            else

            {
                Debug.Log("Handle Touch");
            }
        }

    }
}

记得观察控制台的输出喔


img_ca6b9fb82ef649b729112957b36bf265.png
现在就可以尽情的点击测试了
相关文章
Element-ui 表格(Table)组件中鼠标悬停(hover)样式修改
Element-ui 表格(Table)组件中鼠标悬停(hover)样式修改
2955 0
|
22天前
|
缓存 API 开发工具
有关Unity使用Rider编辑器无法弹出代码提示的有效解决方法
【11月更文挑战第13天】在 Unity 中使用 Rider 编辑器时,若遇到代码提示无法弹出的问题,可以通过检查 Rider 设置(如自动补全选项、Unity 插件安装、索引设置)、Unity 项目设置(如解决方案正确关联、脚本导入设置)以及环境和依赖关系(如 .NET SDK 版本兼容性、Unity 和 Rider 版本兼容性)等方面进行排查和解决。
|
3月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
151 3
|
4月前
|
前端开发 开发工具 图形学
PicoVR Unity SDK⭐️三、详解与UI的交互方式
PicoVR Unity SDK⭐️三、详解与UI的交互方式
|
4月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
4月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
112 0
|
4月前
|
图形学
小功能⭐️Unity获取点击到的UI
小功能⭐️Unity获取点击到的UI
|
4月前
|
图形学
小功能⭐️Unity判断是否单击到了UI
小功能⭐️Unity判断是否单击到了UI
|
4月前
|
图形学
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
|
4月前
|
图形学
小功能⭐️解决Unity 3D UI遮挡穿透问题
小功能⭐️解决Unity 3D UI遮挡穿透问题