【Unity】EventSystem.current.IsPointerOverGameObject()对碰撞体起作用

本来我是用 EventSystem.current.IsPointerOverGameObject()来检测是否点击在UI上的,但是发现,他对我的碰撞体也是返回ture,研究半天。。。。找不出问题,然后发现我的相机上挂载了PhysicsRaycaster,去掉之后就好了,至于为什么相机上挂载PhysicsRaycaster,好像是我的别的同事做的一个物体拖拽,用了 IDragHandler, IBeginDragHandler, IEndDragHandler,来做对3D物体的拖拽。。。我真的是无语。。。他的代码是这样的。。。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using QFramework;

public class ObjDrag : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
    private Vector3 ObjVector3 = Vector3.zero;
    public string deskTag = "desk";
    private Collider collider;
    /// <summary>
    /// isDrag等于false无法交互
    /// </summary>
    public bool isDrag = false;
    void Start()
    {
        collider = GetComponent<Collider>();
    }
   

    public void OnBeginDrag(PointerEventData eventData)
    {
            ObjVector3 = this.transform.position;
        if (isDrag&&Input.GetMouseButton(0))
        {
            StringEventSystem.Global.Send<string>("Begin", eventData.pointerDrag.name);
            Debug.Log(eventData.pointerDrag.name);
        }
    }
    public void OnEndDrag(PointerEventData eventData)
    {
        if (isDrag)
        {
            this.transform.position = ObjVector3;
            StringEventSystem.Global.Send<string>("EndDrag", eventData.pointerDrag.name);
            Debug.Log(eventData.pointerDrag.name);
        }
    }
    /// <summary>
    /// 物体可拖拽
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        if (isDrag && Input.GetMouseButton(0))
        {
            Vector3 screenpos = Camera.main.WorldToScreenPoint(transform.position);
            Vector3 mouseScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenpos.z);
            this.transform.position = Camera.main.ScreenToWorldPoint(mouseScreenPos);
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            var hits = Physics.RaycastAll(ray);
            foreach (var item in hits)
            {
                if (item.collider != null && item.collider.tag == deskTag)
                {
                    var dis0 = Vector3.Distance(Camera.main.transform.position, item.point);
                    var offset = collider.bounds.size.magnitude / 2;
                    var dis1 = Vector3.Distance(Camera.main.transform.position, transform.position) + offset;
                    if (dis1 > dis0)
                    {
                        var precent = 1 - (offset / dis0);
                        transform.position = Camera.main.transform.position + (item.point - Camera.main.transform.position) * precent;

                        //transform.position = item.point;
                    }
                    //transform.position = item.point;
                    break;
                }
            }
        }
    }

}

然后必须在摄像机上挂载Unity UGUI的PhysicsRaycaster (物理射线检测)

下面介绍一下:

PhysicsRaycaster

【Unity】 UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用-CSDN博客

IDragHandler, IBeginDragHandler, IEndDragHandler

【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介绍-CSDN博客

问题就是他们都是用于UI 元素的,然后他用在了3D物体上,导致对我的3D物体起作用,如果一定要在相机上挂载PhysicsRaycaster,又要EventSystem.current.IsPointerOverGameObject只对你的UI 元素起作用,那么可以在这个组件上,用EventMask:指定哪些层的UI元素可以接收事件。比如你的模型是层级是

那么你就可以在EventMask上不勾选Model

 

这样 EventSystem.current.IsPointerOverGameObject()就不会对你指定的模型碰撞体起作用了。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/180970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

王道操作系统大题汇总(纯手写版,思路过程详细)

文章目录 前言&#xff1a;一、计算机系统概述二、进程与线程三、内存管理四、文件管理五、输入/输出&#xff08;I/0&#xff09;管理 前言&#xff1a; 本文为笔者自用操作系统大题复习&#xff0c;大家可以作为学习的参考&#xff0c;文章只收录操作系统常考大题&#xff0…

Django之cookie和session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录sessionSession的由来Session设置查看、更新Session值删除Session值Seesion的其他方法Session的其他配置…

安全牛《数据分类分级自动化建设指南》发布|美创入选代表厂商,分享智能化探索

近日&#xff0c;安全牛发布《数据分类分级自动化建设指南》研究报告&#xff0c;对数据分类分级的主要技术、实施要点、选型指导、发展趋势等展开深入探讨&#xff0c;为各行业数据分类分级自动化工作落地提供帮助与指引。 美创科技被列为代表推荐厂商&#xff0c;落地案例—农…

C++初阶 | [五] 内存管理

摘要&#xff1a;new and delete&#xff0c;定位new&#xff0c;&#xff08;C内存管理的方式&#xff09;&#xff0c;malloc/free和new/delete的区别&#xff0c;内存泄漏 关于内存&#xff1a; 栈又叫堆栈——非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长…

JAVA爬虫2 - Jsoup解析、对接MySQL、多线程爬虫、json库使用

官网:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地从网页中抓取和解析数据。它的主要作用是帮助开 发者处理HTML文档,提取所需的数据或信息。下面介绍几个常用的API: 选择器(Selector)API:用于根据CSS选择器语法选择HTML元素。 属性(Attribute…

深入了解前馈网络、CNN、RNN 和 Hugging Face 的 Transformer 技术!

一、说明 本篇在此对自然语言模型做一个简短总结&#xff0c;从CNN\RNN\变形金刚&#xff0c;和抱脸的变形金刚库说起。 二、基本前馈神经网络&#xff1a; 让我们分解一个基本的前馈神经网络&#xff0c;也称为多层感知器&#xff08;MLP&#xff09;。此代码示例将&#xff1…

Docker | Docker入门安装

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Docker系列 ✨特色专栏&#xff1a; My…

STM32-SPI协议详解及CubeMX+HAL函数配置分析

1 SPI协议 SPI(Serial Peripheral interface)串行外围设备接口是同步全双工的通信总线,在芯片的管脚上只占用四根线。 1.1 物理层 SS/NSS/CS:从设备选择信号线(片选信号线)。由主设备控制,选择指定的从设备。 当主机要选择从设备时,把该从设备的SS信号线设置为低电平…

再探MDG cloud-ready模式!看未来MDG的发展路线

紧跟上一篇博客&#xff0c;我们将更加深入探讨一些MDG Cloud-Ready模式的相关内容。 背景 在2021年9月&#xff0c;Harald Kuck&#xff0c;SAP ABAP Platform老大&#xff0c;介绍了未来ABAP的发展路线&#xff0c;并最终在一年后正式推出了ABAP Cloud。他在会上是这么说的…

指针操作一维数组和二维数组的理解!

指针操作一维数组和二维数组的理解&#xff01; 一维数组二维数组 一维数组 你虽然觉得指针操作一维数组很简单&#xff0c;但是通过做题发现并没有那么简单&#xff0c;特别是二维数组&#xff01;&#xff01;&#xff01;   int main() {//创建一维数组int arr[10] { 0,1…

可以在uni-app使用的类vconsole.js插件

兴致勃勃在uni-app项目引入调试工具vconsole.js结果真机调试页面空白 怎么办?! 别着急 paradox老师有方法 替代插件下载地址&#xff1a;直接下载插件并引入HbuilderXuni_modules插件 - 类Vconsole APP端调试工具 - HF调试器 - DCloud 插件市场 下载完成在main.js中引入&…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架&#xff0c;提供了测试报告定制化功能&#xff0c;相较于我们之前使用过pytest-html插件生成的html格式的测试报告&#xff0c;通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告&#xff0c;接下来让介绍…

机器学习算法——聚类算法

目录 1. 概述2. K-MEANS算法2.1 工作流程2.2 代码实践 1. 概述 聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的对象分组或聚集成具有相似特征的集合&#xff0c;该集合被称为簇(cluster)。聚类算法通过计算数据点之间的相似性或距离&#xff0c;将相似的数据点归为…

企业建数仓的第一步是选择一个好用的ETL工具

当企业决定建立数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;第一步就是选择一款优秀的ETL&#xff08;Extract, Transform, Load&#xff09;工具。数据仓库是企业数据管理的核心&#xff0c;它存储、整合并管理各种数据&#xff0c;为商业决策和数据分析提供支…

java中BigDecimal的介绍及使用(二)

系列文章目录 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…

python爬虫中 HTTP 到 HTTPS 的自动转换

前言 在当今互联网世界中&#xff0c;随着网络安全的重要性日益增加&#xff0c;越来越多的网站采用了 HTTPS 协议来保护用户数据的安全。然而&#xff0c;许多网站仍然支持 HTTP 协议&#xff0c;这就给我们的网络爬虫项目带来了一些挑战。为了应对这种情况&#xff0c;我们需…

vue3的单组件的编写(三)【响应式 API 之 toRef 与 toRefs】

响应式 API 之 toRef 与 toRefs 前面讲了 ref 和 reactive 这两种响应式API &#xff0c;为了方便开发者使用&#xff0c;vue3 还出了两个用来 reactive 转换为 ref 的API&#xff0c;分别是 toRef 和 toRefs 。 &#x1f308;什么是toRef 与 toRefs 这两个API看拼写能猜到&…

(vue)前后端配合实现文件预览功能

(vue)前后端配合实现文件预览功能 1.页面&#xff1a; 2.后台返回数据&#xff1a; 3.预览效果&#xff1a; 4.代码&#xff1a; <el-descriptions-item><template slot"label">文件名称</template><el-button type"text" click"…

数字逻辑电路基础-时序逻辑电路之触发器

文章目录 一、D触发器二、verilog源码三、综合及仿真结果一、D触发器 本文介绍数字逻辑电路中常用的基础时序逻辑电路触发器。它有记忆和存储信息功能,触发器是边沿触发电路。 下图是触发器常用表示方式(时钟上升沿有效): 触发器由两个锁存器组成,前级是主锁存器,后级…

Python接口自动化测试 —— Selenium+pytest+数据驱动

主流自动化框架 selenium &#xff1a;web端自动化框架 &#xff0c;&#xff08;行业里面最核心的框架&#xff09; appium &#xff1a;手机app端框架 requests &#xff1a;接口测试 selenium 工具类封装 selenium提供了很多方法供我们去完成网页元素的操作&#xff0c; 在…