unity射线碰撞检测及layermask中位运算符使用讲解

Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) 目录 Unity 基础 之 Layer(层layer) 、LayerMask (遮罩层) 的 总结 和 使用(CullingMask、Ray 射线的使用等) 一、简单介绍 二、layer 层查看与创建 layer 层查 layer 层创建 三、层的设置(手动设置和代码设置) 层的手动设置 层的代码设置 四、LayerMask 的... 阅读详情

一、射线碰撞检测

今天探讨一下unity中射线用法的种类,经过我的查阅发现有好多呀,还有一些和射线类似功能的东东。

1、摄像机创建射线Ray

首先我们创建一个摄像机射线射线,也是常用的简单射线

 //创建射线,从摄像机位置发射射线到鼠标点击位置
 Ray m_Ray = Camera.main.ScreenPointToRay(Input.mousePosition);

然后就是判断射线是否被collider遮挡(这里的collider就是collider组件,不区分该组件是否勾选trigger),首先利用常见的Raycast创建讲解

①、Raycast和RaycastAll方法:

两个方法基本一样,先看Raycast方法:

RaycastHit m_RayHit;//声明存储射线碰撞到的对象信息结构体

if (Physics.Raycast(m_Ray, out m_RayHit, Mathf.Infinity, 1 << 
      LayerMask.NameToLayer("Cube")))
  {
      Debug.Log("Cube射线检测到:" + m_RayHit.collider.gameObject.name);
      Debug.DrawLine(m_Ray.origin, m_RayHit.point);
  }

 上面代码中Physics.Raycast(m_Ray, out m_RayHit, Mathf.Infinity, 1 << LayerMask.NameToLayer("Cube"))返回值类型为bool,就是判断是否碰撞到collider,如果碰撞到返回为真,并且将碰撞到的第一个collider信息存到RaycastHit类型的m_RayHit中,最后一个参数就是本篇文章的第二话题,我们稍后一起讲,先简单理解此处他表示只检测Layer名字为Cube的层。

第二个RaycastAll方法:

RaycastHit[] RayHits = Physics.RaycastAll(m_Ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("Cube"));

if (RayHits.Length > 0)
{
     for (int i = 0; i < RayHits.Length; i++)
     {
         Debug.Log("Cubes检测到:" + RayHits[i].collider.gameObject.name);
         Debug.DrawLine(m_Ray.origin, RayHits[i].point);
     }
}

可以发现它返回的不是bool类型了,而是一个数组,是因为它检测的是这条射线碰撞到的所有collider信息,这就是两者最大的区别。

②、SphereCast方法

其实这里它可以归为一类发射射线方法(例如BoxCast()、CapsuleCast()等等),就是这个的射线不再是一条一维的线了,他可以理解为是一个方向,然后向这个方法投各种形状物体,依照SphereCast就是向某个投掷球形物体,但是有一个不好的就是他不能检测起点到半径之内的物体,也就是说发出射线的时候就已经包含在球半径内的话是不能被检测到的,下面代码样例:

if (Physics.SphereCast(m_Ray, 3,
    out m_RayHit, Mathf.Infinity, 1 << LayerMask.NameToLayer("Cube")))
{
    Debug.Log("Cube球形射线检测到:" + m_RayHit.collider.gameObject.name);
    Debug.DrawLine(m_Ray.origin, m_RayHit.point, Color.red, 3.0f);
}

这里的3就是球形半径,其实这个方法我还没想出来如果不知道原理该如何打印出来这条射线,但是如果想验证它是否真的有“粗”度了,可以利用第一个方法对比就会一目了然了?。

③、OverlapSphere方法

这个方法就完美的填补了上一个SphereCast方法中无法检测半径内的collider物体的遗憾了,它主要检测和球形物体相交或在内部的collider。不过我认为他不算是射线了,有些类似触发器,但是他检测的物体并没有触发器事件那么多的前提条件,他也是只要检测物体有collider组件即可,而且它可不仅仅只有Sphere一个形状哟,还有Box,Capsule等等吧,下面代码样例:

Collider[] HitSpheres = Physics.OverlapSphere(transform.position, 3,
                1 << LayerMask.NameToLayer("Cube"));
if (HitSpheres.Length > 0)
{
   for (int i = 0; i < HitSpheres.Length; i++)
   {
       Debug.Log("Cubes检测到:" + HitSpheres[i].gameObject.name);
   }
}

/// <summary>
/// unity事件
///绘制物体事件
/// </summary>
private void OnDrawGizmos()
{
   Gizmos.color = Color.red;
   //线框绘制
   Gizmos.DrawWireSphere(transform.position, 3);
}

 这个方法是直接返回collider数组,3同样表示球形半径,下面的OnDrawGizmos函数是unity自带的一个绘制物体函数,主要为了便于观察。

二、利用其他物体发射射线

此处和前面类似不多解释,先看代码:

根据物体创建射线。
Vector3 fwd = transform.TransformDirection(Vector3.forward);//方向
if (Physics.Raycast(transform.position, fwd, out m_RayHit))
{
     Debug.Log("物体自身发射射线:" + m_RayHit.collider.gameObject.name);
     Debug.DrawLine(transform.position, m_RayHit.point);
}

 直接利用Raycast方法,设定起点和方向即可,省去了创建Ray射线步骤。

二、layermask中位运算符

本节参考链接:https://www.cnblogs.com/leeplogs/p/9133824.html

首先说一下位运算符

按位运算符:与(&)、非(~)、或(|)、异或(^)、<<(左移)、>>(右移)。位运算符主要用来对二进制位进行操作。

与运算符:只有两个位都是1,结果才是1;

或运算符:只要两个位有一个是1,结果就是1;

非运算符:如果位为0,结果是1,如果位为1,结果是0;

异或运算符:两个操作数的位中,相同则结果为0,不同则结果为1;

左移运算符<<:左移表示乘以2,左移多少位表示乘以2的几次幂;

右移运算符>>:移动多少位表示除以2的几次幂。

 

Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位。

0000 0000 0000 0000 0000 0000 0000 0000

31                    0

eg:

(1)Physics.Raycast(m_Ray, out m_RayHit, Mathf.Infinity, 1 << 8) ----开启Layer8

其中 <<左边的 1表示有[开启],0表示没有该layer[忽略] 。右边的2表示左移2位即是 layer2层的位置。

(2)Physics.RaycastAll(m_Ray, Mathf.Infinity, 1 << 9|1<<10) ----开启layer 9和layer 10

(3)Physics.RaycastAll(m_Ray, Mathf.Infinity, 1 << 9|0<<10) ----开启Layer9 并关闭 Layer10

(4)Physics.RaycastAll(m_Ray, Mathf.Infinity, ~(1 << 9)) ----关闭Layer9层,变0 按位取反 ~
上面列举了我在unity经常使用的一些位运算符,其他的含义已经为大家列举出来了,可以时情况而应用

Unity Physics.SphereCast的理解 阅读详情

相关推荐

Unity之射线穿透

小白欢迎评论,共同探讨,共同进步      一般的射线射中物体后就被阻挡了,假如碰到物体后,就会被拦截。如果我们想实现穿透某些物体,或者使射线不穿透UI的话。这时候就需要穿透的知识了。 下面写一个简单的射线。   public Transform RayStartPoint; private Ray ray; // Use this for initialization  void

黑色、最低调的奢华ㄛ的博客 1万+

Physics.Raycast

是 Unity 中用于检测物体之间碰撞的函数之一。它使用一条射线来检测场景中的物体,返回一个bool值表示是否检测到了碰撞,以及一个RaycastHit结构体存储着射线碰撞到的物体的信息。

qq_20179331的博客 4974

【Unity每日一记】Physics.Raycast 相关_Unity中的“X光射线”

X光射线

秩沅 1376

unity3D-射线RaycastAll

参考文献: 部分内容由千峰教育(莫新宇)听课笔记及Scripting API总结file:///D:/myUnity/Editor/Data/Documentation/en/ScriptReference/Physics.RaycastAll.html Physics.RaycastAll Parameters 参数 ray The starting point and direction of the ray. 射线的出发点及方向 maxDistance The max di.

renwen1579的博客 2300

win2016 php mysql_Windows Server 2016 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程 | 系统运维...

准备篇一、环境说明:操作系统:Windows Server 2016PHP版本:php 7.1.0MySQL版本:MySQL 5.7.17.0二、相关软件下载:1、PHP下载地址:2、MySQL下载地址:3、Microsoft Visual C++ 2010 可再发行组件包(安装MySQL需要此插件)4、Visual C++ Redistributable for Visual Studio 20...

weixin_34794420的博客 1377

PaddleOCR多进程GPU推理实战:200万图片高效处理方案

本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。

prometheus9mon的博客 261

浅谈Unity3D中Layers和LayerMask

层和层的掩码是游戏中重要的角色,在Unity中用int32数据类型来表示32个Layer层。int32表示二进制一共有32位(0—31)。 在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!         LayerMask实际上是一个位码操作,

月亮之火的博客 5469

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 388

Unity中的Physics使用方法

——个人学习笔记 射线(Physics .Raycast和Physics.RaycastAll) 常用函数解析 (其有很多重载,而且两者差不多,前者直会检测到第一个碰撞体,而后者则会返回在射线长度内都检测到的碰撞体,下面就只介绍前者) Physics .Raycast(Vector3 origin, Vector3 direction, float maxDistance , int l...

weixin_43701019的博客 4857

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2000

Tessent Atpg系列 第七章 Running ATPG Patterns -- 如何书写proc文件

本篇文章是记录Tessent scan ATPG系列 本文并非是对userguide的完全翻译,而是自己对userguide的理解,此外,有部分比较深入的内容可能需要后续实验验证。本系列并不对tessent scan做过多描述。 请勿随意转载: 优快云 博主: ciscomonkey一种是在使用tessent scan之后使用ATPG 另一种是使用第三方工具,如snps的DFTC之后使用tessent的ATPG。 这里我们仅仅介绍without tessent scan之后tessent ATPG:对于t

ciscomonkey的博客 7694

unity Physics.RaycastAll

简用 unity Physics.RaycastAll

作孽就得先起床的博客 1597

深入解析音频信号处理的核心算法——傅里叶变换、语音增强、回声消除与主动降噪

本文系统介绍了现代音频信号处理的核心技术。首先阐述傅里叶变换作为理论基础的重要性,它能将声音分解为频域成分。随后重点分析三大关键技术:语音增强利用谱减法、维纳滤波和深度学习从噪声中提取人声;回声消除采用自适应滤波器消除通话中的回声;主动降噪通过声波干涉原理抵消环境噪声。文章最后指出,这些技术在实际应用中协同工作,形成完整的音频处理链路,共同提升语音质量和听觉体验。随着算法进步和算力提升,音频处理技术正向着更智能、更高效的方向发展。

程序猿老樊的博客 1327

【Unity】详解Unity中的射线与射线检测

碰撞检测可以帮助我们实现诸如抵达某个地点自动触发剧情、判断子弹是否击中玩家等功能,但我如果想要实现如当鼠标悬浮某个人物上,自动弹出该人物信息,要如何判断呢?这时使用碰撞检测,从摄像机生成一个透明碰撞体朝着人物移动,等碰撞到了人物再弹出该人物信息?会不会太繁琐了。或许你又会想,若我直接生成一个足够长的透明碰撞体呢,是不是在创建的那一刻就可以触发该人物的弹出信息逻辑?没错这样的确可以,而这就是射线!不过是把无限长的透明碰撞体变为了无限长的一条线,仅此而已。

希望有志同道合的的朋友可以互相学习! 8833

使用Qt Creator调用eBUS SDK

在新界面,勾选左下角“ Show unreachable Network Devices",可以看到没有成功连接的网络相机,原因是IP地址配置错误。每个版本的OpenCV的依赖项的名字都不同,我这里是opencv_world490.lib与opencv_world490d.lib。函数,可以看到在这里是图像缓存区,能够对捕获的图像进行一些操作。在Visual Studio打开项目属性,在VC++目录这里,把Opencv的路径添加进去。这时,会自动跳转到mainwindow.cpp,生成该按钮对应的槽函数。

qq_35685051的博客 1288

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity3d Physics 射线粗谈

Physics.SphereCast Physics.SphereCast 球形射线。相比Physics.Raycast,就是把射线的宽度给增加了。这里有个误区就是使用它检测射线起点周围的物体,话说是球形的话,如果以人物的中心发射出射线,应该是可以检测到以人物为中心设定半径的球体内的物体的,但是测试是不能的。 下面是参数,API的中文翻译很坑,为加强理解加了如下注释 origi

漩子——二进制看世界 7868

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Unity的各种射线检测方法性能对比

以下皆为万次循环消耗: ScreenPointToRay:摄像机到屏幕的一条射线 平均8.9ms ScreenToWorld:屏幕坐标转世界坐标 平均6.7ms PhysicRaycast:从一点向一个方向发射一条射线 平均18.3ms (检测物体越多,消耗越大) OverlapSphere:球形范围检测 平均15ms (检测物体越多,消耗越大,有GC) SphereCast:球形投射(检测到一个就返回) 平均18.5ms(无GC) SphereCastAll:.

LM514104的博客 5916

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SphereCast和SphereCastAll

http://blog.csdn.net/l773575310/article/details/73251093 从摄像机所在位置发送一个球体射线,看看射线之间有没有碰撞体。 绿色的球为射线发射的起点; 红色为路径上的球体射线; 蓝色为目标检测点; 这里可能不太好懂的是红色的球,这里可以暂时放一放。 我们暂时将蓝色的球隐藏掉,并且使用下面的代码,发送球体射线。 代码如下:usi

小孔明的专栏 8350

Unity 射线检测(Raycast)检测图层(LayerMask)的设置

Raycast函数有很多重载(函数的重载根据函数的参数来决定)这里只涉及一下这个重载关于第四个参数:int layerMask;一开始时,我认为这里的int 就是在Inspector里图层的索引;如下图,被红色圈起来的就是图层的索引:我实现的这个射线检测无论怎样都无法检测出Player图层;其实这里第四个参数其实对应的是2^(索引);如果要获得Player图层的话,第四个参数应该填上2的6次方,也就是64才对;

weixin_73569934的博客 2429

【第019问 Unity中对SpherecastCommand的理解?】

游戏中对多个Physices.SphereCast()采用SpherecastCommand进行优化

平台不倒,记录不息 1298

SC-102笔记:Unity物理系统详解

本节课讨论了关于碰撞检测、关节组件、作用器和射线检测的一些进阶知识。注意:虽然是进阶知识,但是和实际应用相比这些知识依然是非常简单的。实际的应用场景非常复杂,需要我们做出一些针对实际应用的变化。

qq_35933041的博客 522

Unity - Ray射线检测

一:Ray射线 定义:射线是一条从原点出发,沿某一方向运动的无限直线。 //创建一条初始位置为startPos,方向为dir的一条射线 Ray ray = new Ray (startPos, dir); //创建一条从摄像机通过屏幕点的光线。 //得到的光线在世界空间中,从相机的近平面开始,经过屏幕上的(x,y)像素坐标(位置)。z是忽略。 Ray camerRay = Camera.main...

长生但酒狂的博客 4176

UGUI源码之RaycastAll方法

即Physics2DRaycaster,PhysicsRaycaster,GraphicRaycaster,其中前两个必须和Camera组件一起使用。当使用EventSystem.current.RaycastAll方法时,会遍历所有的Raycaster,执行它们的Raycast方法。当鼠标放到Image上时,输出Image的名字,当鼠标放到Cube上时,输出Cube的名字,Cube必须带有Collider。所有继承了BaseRaycaster的类会在OnEnable的时候将自己添加到列表中。

Morris-w的专栏 459

【Unity 知识】设置射线检测层级,Physics.Raycast的layerMask含义

射线检测我们经常使用,可以得到射线碰撞检测到的信息。 Physics.Raycast(Ray ray, out RaycastHit hitinfo, float maxDistance) 但如果有些物体并不需要被射线检测,但它显示在需要被射线检测物体之前,并且还拥有碰撞体,会导致射线检测无法达到我们预期的效果。 我们就需要用到他的第四个参数layerMask。 Physics.Raycast(Ray ray, out RaycastHit hitinfo, float maxDistance, in

boyZhenGui的博客 9735

Unity–射线-Raycast射线检测

Raycast和RaycastAll是函数,使用射线来检测碰撞,通过Physics来调用。Raycast返回的是bool值,RaycastAll返回的是一个数组。RaycastHit是一个结构体,记录射线的碰撞信息。检测到了之后,存进hitInfos数组里。3.射线检测多个RaycastAll。当鼠标指向物体时,屏幕上显示物体名称。直接将变色之后的物体层数改变。Ray是一个类,表示射线。4、鼠标悬浮显示物体名称。layerMask:层。1.射线指向物体变色。

m0_74263898的博客 1053
上一篇: unity软体控制详解(2)——3D软体控制PSoftBody使用
下一篇: unity3D中对于切换场景利用单例模式实现数据共享
勤学者闯天涯
博客等级 码龄10年 25粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值