unity3d 如何拦截射线碰撞界面的消息

Unity3D射线检测(Raycast)原理与高效应用实战指南 在游戏开发与3D交互应用中,碰撞检测是实现用户交互的核心基础技术。其原理是通过几何计算判断物体间的空间关系,传统物理碰撞检测虽然直观,但在处理大量物体或非接触式交互时效率较低。射线检测(Raycast)作为一种高效的替代方案,通过从起点沿方向发射虚拟射线进行相交测试,直接获取命中信息,计算开销极小,在性能敏感场景中价值显著。该技术广泛应用于游戏中的点击选择、射击判定、地面检测等交互场景,以及工业仿真中的精密模型点选。结合Unity3D引擎,开发者可通过LayerMask分层优化、JobSystem批处理等手 阅读详情

转自:  http://blog.youkuaiyun.com/lzhq1982/article/details/12854527


这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的,好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。


方案一:利用标签(Tag)拦截射线消息。

每个GameObject的Inspector面板最上方都有个Tag选项,也就是说我们可以给所有的物体加个标签,Unity3d已经默认有了几个标签,这里我们可以自定义个UI的标签,然后把所有UI都用这个标签。点击Tag右方的选项,选Add Tag,Size调成2,Element 0的值改成UI。


然后你所有不想被点穿的UI都选成这个标签。

除了设置标签,还有一点很重要,就是界面要加碰撞器Collider,有的UI默认就有碰撞器,比如NGUI的按钮,你可以看到有一个Box Collider,如果没有的你就要自己加了,Size那里要调成这个UI的尺寸:


这样UI才能接收射线碰撞,然后代码可以这样写:

[csharp]  view plain copy
  1. Ray ray1 = nguiCamera.camera.ScreenPointToRay(Input.mousePosition);  
  2. RaycastHit hit1;  
  3. if (Physics.Raycast(ray1, out hit1)) {  
  4.     if (hit1.collider.gameObject.tag == "UI")  
  5.         return;  
  6. }  

上面的nguiCamera是获取的NGUI下的Camera,因为是这个Camera发出的射线与UI的碰撞,而不是Main Camera,这点要注意。其他的不解释了,很简单,自己看。


方案二、利用层(Layer)拦截射线消息

每个GameObject的Inspector面板最上方都也有个Layer选项,就在Tag旁边,unity3d已经有了几个层,我们新建个层,也叫UI,点击Add Layer,可以看到从Layer0到Layer7都灰掉了,那是不能用的,从第八个起可以用,所以在第八个建个UI的层。


然后我们看一下Physics的Raycast的参数:

static function Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

一般情况下我们只用前两个参数,distance表示射线距离,默认是无限远,重点是最后一个参数layerMask,专门处理layer过滤的,是个整型,怎么用呢,是靠layer的二进制位来操作的,看下面代码就清楚了:

[csharp]  view plain copy
  1. Ray ray1 = nguiCamera.camera.ScreenPointToRay(Input.mousePosition);  
  2. RaycastHit hit1;  
  3. LayerMask mask = 1 << LayerMask.NameToLayer("UI");  
  4. if (Physics.Raycast(ray1, out hit1, 600, mask.value)) {  
  5.     return;  
  6. }  

LayerMask的NameToLayer是通过层的名称返回该层的索引,这里是8,然后1<<8换算成LayerMask值,再用LayerMask的value就可以了。

注意也必须设置collider才能接收碰撞,这里才能判断到。

我这里提供了两个方案,如果有其他方案的欢迎留言,谢谢。

Unity3D桌面精灵开发指南:从无边框窗口到智能交互全解析 在桌面应用开发领域,实现一个美观、低占用且能与用户自然交互的常驻窗口程序是许多开发者的追求。其核心原理在于通过窗口管理技术,创建无边框、透明且置顶的界面,并利用图形渲染引擎(如Unity)驱动内容呈现。这项技术的工程价值在于,它打破了传统桌面应用与游戏引擎的界限,使得开发者能够利用成熟的游戏开发工具链和资源管线,快速构建出视觉表现力强、交互丰富的桌面伴侣或信息展示组件。结合智能点击穿透、按需渲染等优化手段,这类应用可在长期后台运行时保持极低的系统资源消耗。典型的应用场景包括桌面美化工具、工作效率助手、个性化 阅读详情

相关推荐

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2583

unity3d学习笔记(十三)--如何拦截射线碰撞界面的消息

这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的,好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。 方案一:利用标签(Tag)拦截射线消息

lzhq1982的专栏 1万+

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 610

Unity3D中防止射线穿透UI

【代码】Unity3D中防止射线穿透UI。

abcd5711664321的博客 1706

青藏高原冻土数据实战:如何用QGIS分析1961-2020年冻土退化趋势(附完整操作步骤)

本文详细介绍了如何使用QGIS分析1961-2020年青藏高原冻土退化趋势,包括数据准备、预处理、时空分析和模型验证等全流程操作。通过TTOP模型和Stefan方程,揭示了冻土退化的空间差异和海拔依赖性,为环境研究提供科学依据。

weixin_29276847的博客 127

EBS开发_离散工单创建API

--以下代码于20171213在TONY环境中实现 DECLARE     l_iface_rec    wip.wip_job_schedule_interface%ROWTYPE; --工单任务接口表     l_group_id     NUMBER;     l_returnstatus VARCHAR2(40);     l_errormsg     VARCHAR2(2000

蜗牛先生快跑的博客 2596

Unity射线穿透UI解决

按常理这部分的射线是会被按钮挡住的,不应该再出现log里的内容了,但现实是UI和后面的cube都可以响应,unity场景中,射线是可以穿透UI的。我用过很多版本,都有这个问题。大括号只有一半,那是我希望你可以动手补上另一半。点击这个物体就会出现log显示这个物体的名字,代码在下面。运行之后确实会弹出这个log,这没有什么问题。我在场景中新建了一个cube名叫:我秦始皇打钱。之后我又在物体上面用一个按钮挡住了一部分。其实最上面的代码里有这句话,注释掉的就是。最后,复制代码记得补上缺失的大括号。

alayeshi的专栏 3452

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 47

Unity阻止射线穿透UI的方法之一

作者:StormerZ https://www.bilibili.com/read/cv27797873/ 出处:bilibili。

yangzhen_010的博客 1291

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1669

DJI O2协议物理层逆向工程解析:揭开无人机通信的神秘面纱

DJI的O2协议是其OcuSync传输技术的最新演进,应用于Mini 2、Mavic Air 2、Mavic Air 2s和Mavic 3等无人机模型。这种协议结合了多种先进无线通信技术,能够在远距离提供稳定可靠的低延迟连接。O2协议物理层(PHY)是OSI模型的最底层,负责在物理媒介上传输原始数据比特流。它定义了电气特性、调制方式、编码方案、数据传输速率和同步机制等。DJI O2协议的物理层逆向工程是一个复杂但极具价值的领域。

QQ_778132974的博客 2385

unity 如何使鼠标点击射线穿透ui 使ui无法阻挡点击

有时候想让ui放在最上层但是让点击射线不受阻挡 可以给这个ui物体添加canvas group 然后取消勾选blocks raycasts 就解决了

axiang233333的博客 3112

PY32F406K1CU6+I2C+ AT24C64 基本配置

【代码】PY32F406K1CU6+I2C+ AT24C64 基本配置。

sam的博客 90

Unity3D 射线指定层获取GameObject 注意 LayerMask

这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的, 好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。 方案一:利用标签(Tag)

eCaiFu800的专栏 3885

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Unity3D 射线指定层获取GameObject 注意

这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的, 好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。 方案一:利用标签(Tag)

yaokang522的专栏 1861

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

射线检测

Unity3D 射线指定层获取GameObject 注意   (2014-03-03 19:04:22) 转载▼ 标签:  raycast   layer   it   分类: Unity3D 转载:http://blog.youkuaiyun.com/lzhq1982/article/details/12854527

JudyZZL的博客 633

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Unity3D WebGL+B/S架构打造跨平台虚拟实训室:技术选型、架构设计与性能优化

虚拟仿真技术通过构建沉浸式三维交互环境,为工程实训与技能培训提供了高效、低成本的解决方案。其核心原理在于利用游戏引擎的实时渲染与物理模拟能力,结合现代Web技术栈,实现复杂三维应用在浏览器端的流畅运行。这一技术组合在职业教育、企业培训等领域具有重要价值,能够突破传统C/S架构在部署、更新和跨平台访问上的限制。本文以综合布线虚拟实训室为例,深入探讨了Unity3D WebGL与B/S架构的融合实践,涵盖了从solidworks模型导入unity3d后的优化处理、unity3d terrain同步缩放等具体技术

weixin_33847182的博客 434

Unity UGUI事件监听全解析:从基础原理到高级应用实战

在Unity游戏开发中,事件监听是实现用户界面交互的核心机制。其原理基于观察者模式,通过事件系统将用户输入转化为可响应的信号,从而实现UI组件与游戏逻辑的通信。这一机制的技术价值在于解耦UI表现与业务逻辑,提升代码的可维护性和模块化程度。在应用场景上,无论是按钮点击、滑块拖动还是输入框编辑,都离不开高效可靠的事件监听。本文聚焦于Unity UGUI的事件监听,深入探讨了其三种主流实现方式:Inspector面板拖拽绑定、脚本代码动态绑定以及实现特定接口,并针对内存管理、性能优化等常见问题提供了解决方案。通过

weixin_34208185的博客 402

UGUI防止点击穿透

if (!IsPointerOverGameObject(Input.mousePosition)) { } public static bool IsPointerOverGameObject(Vector2 screenPosition) { //实...

weixin_30596023的博客 379

unity射线穿透UI的问题解决方案

首先参考原文章:http://www.cnblogs.com/fly-100/p/4570366.html 致敬原作者,代码稍作修改才可使用。 首先先引入头文件 using UnityEngine.EventSystems; using UnityEngine.UI; 然后创建变量 public GameObject changePanel;(这是要阻挡射线的UI)

lyy8l的博客 7732

Unity U物理射线检测GUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

传统关系型数据库

sdhs88566554的博客 477

『功能项目』禁止射线穿透行为【05】

射线禁止穿透UI

weixin_69360830的博客 794
上一篇: unity3d中使用DLL库和解析json
下一篇: unity3d读取plist或xml文件
我是一纸巾
博客等级 码龄12年 14粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值