unity射线碰撞检测+LayerMask的使用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
unity射线碰撞检测+LayerMask的使用
http://www.unitymanual.com/thread-21402-1-1.html

(出处: -游戏开发者社区【游戏蛮牛】unity3d官网)微笑

射线在unity中是个很方便的东西,对对象查找、多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽
好了,话补多说啦,直接进入主题:

射线:在unity中射线是由一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。

相关API:



1、Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点



2、Ray Camera.main.ViewportPointToRay(Vector3 pos)  返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点



3、Ray 射线类



4、RaycastHit 光线投射碰撞信息



5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)



    当光线投射与任何碰撞器交叉时为真,否则为假。



    bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)



    在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。



    bool Physics.Raycast(Ray ray, float distance, int layerMask)



    当光线投射与任何碰撞器交叉时为真,否则为假。



    bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)



    当光线投射与任何碰撞器交叉时为真,否则为假。






    注意:如果从一个球型体的内部到外部用光线投射,返回为假。



    参数理解:



  origin : 在世界坐标中射线的起始点



  direction: 射线的方向



  distance: 射线的长度



  hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。



  layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞



6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)



   投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。



列子如下:

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using UnityEngine;
 
using System.Collections;
 
 
 
public class RayTest : MonoBehaviour {
 
 
 
     // Use this for initialization
 
     void Start ()
 
     {
 
         mainCrma = Camera.main;
 
     }
 
     private Camera mainCrma;
 
     private RaycastHit objhit;
 
     private Ray _ray;
 
     void Update ()
 
     {
 
         if (Input.GetMouseButtonDown(0))
 
         {
 
             _ray=mainCrma.ScreenPointToRay(Input.mousePosition); //从摄像机发出一条射线,到点击的坐标
 
             Debug.DrawLine(_ray.origin,objhit.point,Color.red,2); //显示一条射线,只有在scene视图中才能看到
 
 
 
             if (Physics.Raycast (_ray, out objhit, 100))
 
             {
 
                 GameObject gameObj = objhit.collider.gameObject;
 
 
 
                 Debug.Log( "Hit objname:" +gameObj.name+ "Hit objlayer:" +gameObj.layer);
 
             }
 
         }
 
     }
 
}









layerMask参数:  



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



其实很简单:1 << 10  打开第10的层。



~(1 << 10) 打开除了第10之外的层。



~(1 << 0) 打开所有的层。



(1 << 10) | (1 << 8) 打开第10和第8的层。



列子如下:
[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using UnityEngine;
 
using System.Collections;
 
public class LayerMaskTest : MonoBehaviour {
 
    
 
     // Use this for initialization
 
     void Start ()
 
     {
 
         mainCrma = Camera.main;
 
         mask = 1<<( LayerMask.NameToLayer( "cube" )); //实例化mask到cube这个自定义的层级之上。
 
     }
 
    
 
     //private LayerMask mask 1<<10;
 
     private LayerMask mask;
 
     private Camera mainCrma;
 
     private RaycastHit objhit;
 
     private Ray _ray;
 
     void Update ()
 
     {
 
         if (Input.GetMouseButtonDown(0))
 
         {
 
             _ray=mainCrma.ScreenPointToRay(Input.mousePosition); //从摄像机发出一条射线,到点击的坐标
 
             Debug.DrawLine(_ray.origin,objhit.point,Color.red,2); //划出射线,只有在scene视图中才能看到
 
             if (Physics.Raycast (_ray, out objhit, 100, mask.value))
 
             {
 
                 GameObject gameObj = objhit.collider.gameObject;
 
                 Debug.Log( "Hit objname:" +gameObj.name+ "--Hit objlayerName:" +LayerMask.LayerToName (10));
 
             }
 
             
 
         }
 
         
 
     }
 
}




创建2个cube,一个layer设置为:cube  一个layer设置为:Default

运行如下:

 



=============================

Ray只有起点和方向.函数附加x距离内的条件。



用到的Raycast主要有两个:

Physics.Raycast:

作用于任何物体,可以加限定 只检测某layer层

RaycastHit hit;

if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f))

    print("dawdddd");



RaycastHit hit;

if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f,8))

    print("dawdddd");

Collider.Raycast:

只检测ray是否穿过该Collider

[C#]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
RaycastHit hit;
 
Ray ray= new Ray(transform.position,Vector3.down);
 
if (collider.Raycast(ray, out hit,100))
 
             print( "dawdddd" );






注意:

(1)无论是哪种raycast检测,从物体内部穿到外面的,都不视为穿过。只有从物体外穿到里面的才视为穿过。

(2)可以绘制 可见线 来辅助开发

1.Debug.DrawLine(V3 start,V3 end);

2. Gizmos.DrawLine   (可以在编辑模式下显示,可视化更强)

如果在scene的Gizmos选项下 勾选 3D Gizmos, 那么线段位于真实3D空间里,有前后遮挡。

如果不勾选,则gizmo永远在最前显示。

   
[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
void OnDrawGizmos () {
 
        Vector3 checkPos_a =transform.position + new Vector3(0,0,0.2f);
 
     
 
        Gizmos.color = Color.green;
 
        Gizmos.DrawLine(checkPos_a,checkPos_a + Vector3.down*15);
 
    }

unity3d————射线检测 方法用于检测射线与物体的碰撞,但它不会分配新的数组,而是使用传入的数组来存储碰撞信息。如果发生碰撞,它会返回碰撞的数量。方法用于从射线发出点开始,沿着射线方向检测所有碰撞到的物体。有一个重载版本,允许直接使用起点和方向来创建射线。属性会存储碰撞点处物体表面的法线。结构体包含碰撞信息,如碰撞点、碰撞物体的。在射线投射中,如果射线与物体发生碰撞,在 Unity 中,您可以使用。数组,每个元素包含碰撞信息。属性来获取碰撞点处的法线。 阅读详情

相关推荐

unity LayerMask参数

Unity中,每个GameObject都有一个Layer属性,用于指定该GameObject所属的层。Layer可以用来区分不同类型的物体,例如玩家、敌人、地形等。LayerMask是一个32位的位掩码,用于在Unity中指定一个或多个层。它通常用于射线投射、碰撞检测等场景中,用于指定需要检测的层。

qq_20179331的博客 1878

Unity 实现射线检测

unity 实现射线检测

weixin_44306106的博客 596

【唐老狮】Unity——物理系统(射线检测

【学习目标】 射线检测 能够通过射线检测进行碰撞判断 能够通过玩家点击屏幕检测选中的物体 【射线检测】 作用 可以利用3D世界中的射线,和3D世界中的物体进行碰撞(相交)判断,利用它可以实现射击 ​ 必要条件碰撞体 射线 【3D世界中射线】 由线段的一端无限延长所形成的直的线,由起点和方向两个关键属性构成 代码中创建射线对象 代码中创建射线对象 注意:这里画的是线段,用来看射线的方向的,真的射线是从起点向方向无限延伸的 【屏幕发出的射线】 根据玩家在屏幕上点击的位置,

MrTang_Unity的博客 3707

【零基础入门unity游戏开发——unity通用篇19】GameObject的常见操作(基于unity6开发介绍)

GameObject的常见操作(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1540

详解Unity中的射线射线检测

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

梦小天幼的博客 5万+

Unity--射线检测--RayCast

Unity--射线检测--RayCast

qq_40669895的博客 8748

Unity射线碰撞检测LayerMask使用

Unity射线碰撞检测接口: Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) layerMask参数设计如下: 1 &lt;&lt; 10 打开第10的层。 ~(1 &lt;&lt; 10)...

iDaDi的博客 717

Unity碰撞检测射线与胶囊体投射/Layer(层)、LayerMask(遮罩层)

LayerMask 实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。Unity 中的使用:表示开启Layer3。表示关闭Layer8。表示开启Layer1和Layer9。表示关闭Layer4和Layer5。LayerMask mask = ~(1 << 0) 打开所有的层。LayerMask mask = ~(1 << 9) 打开除了第9之外的层。//LayerMask使用(Physics.Raycast)

wangyuhua_的博客 1670

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

一、射线碰撞检测 今天探讨一下unity射线用法的种类,经过我的查阅发现有好多呀,还有一些和射线类似功能的东东。 1、摄像机创建射线Ray 首先我们创建一个摄像机射线射线,也是常用的简单射线 //创建射线,从摄像机位置发射射线到鼠标点击位置 Ray m_Ray = Camera.main.ScreenPointToRay(Input.mousePosition); 然后就是判断射...

cgExplorer的博客 1336

Unity3D射线检测如何使用Layers和LayerMask

Unity中用int32数据类型来表示32个Layer层,int32表示二进制一共有32位(0—31)。在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!如图: 在代码中使用layers时,先了解 按位运算符:左移运算符<<,左移表示乘以2,左移多少位表

z轴的博客 8943

Unity射线忽略某层碰撞(踩坑)

按位与的这种,层计算方式,很多人博客都写了,估计你查了很多篇资料才翻到我这,所以按位与计算不在本篇重点。 这是官方中文文档https://connect.unity.com/doc/Manual/Layers可以看一下。 那么为什么按照官方文档,按位与,计算好层,传入Physics.Raycast中后, 依然没什么卵用! 写好的逻辑,毫无效果! 为什么! 首先,感谢下面链接作...

Endboil的博客 6823

Unity射线检测LayerMask的用法

using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestRaycast : MonoBehaviour { private void Update() { Ray ray = Camera.main.ScreenPointToR...

两水先木示的博客 2380

Unity 射线检测

Unity 射线检测详解

明明明的博客 3392

UnityLayerMask的学习手记

Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。 代码释义: LayerMask mask = 1 LayerMask mask = 0 LayerMask mask = ~( 1 public

Something 2348

unity 2D射线使用方法

unity 2D射线使用方法

qq_42879708的博客 2135

Unity的坑: LayerMask

Unity的坑: LayerMask

Had的博客 780

Ray射线

射线的机制相当于碰撞; 创建射线: 1 Ray ray=new Ray(); origin : 射线发射的原点; direction: 射线发射的方向; distance: 射线的长度; hitInfo: 如果返回true,hitInfo将包含碰撞器碰撞的更多信息; Layer: gameObject的层; LayerMask: 只选定LayerM...

anqifu2059的博客 199

Unity 3D射线检测指定层级

3d射线 返回屏幕射到的hit 只检测我们指定的渲染层级 1 << 12 打开第10的层。 等同于1 << LayerMask.NameToLayer(“Name”); 也等同于 LayerMask.GetMask((“Name”); #region 3d射线 返回屏幕射到的hit 只检测我们指定的渲染层级 public static RaycastHit RayHit() { Ray ray = Camera.main.ScreenPoint

喝口我的爽肤水的博客 2990
上一篇: Ngui 五种点击事件实现方式及在3d场景中点透的情况
下一篇: Unity3D 解析泛型集合使用
暗默锋
博客等级 码龄17年 23粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值