Unity之射线穿透

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36282052/article/details/70225549

   小白欢迎评论,共同探讨,共同进步奋斗

 

   一般的射线射中物体后就被阻挡了,假如碰到物体后,就会被拦截。如果我们想实现穿透某些物体,或者使射线不穿透UI的话。这时候就需要穿透的知识了。

下面写一个简单的射线

 

public Transform RayStartPoint;

private Ray ray;

// Use this for initialization 

void Start ()

{

       ray =new Ray(RayStartPoint.position, transform.forward);

       RaycastHit hit;

       if (Physics.Raycast(ray,out hit, 500))

       {

       //打印碰撞信息 

       print(hit.collider.name);

       //画线,使其射线可视化。 

       Debug.DrawLine(RayStartPoint.position, hit.point, Color.red,100);

       }

}

 

射线只碰撞第一个方块就截断了。打印信息也为第一个方块的名字。

 

    下面我们再来添两句代码,使其实现穿透效果,让射线可以穿透前两个射到第三个方块身上。

首先申请一个变量。

 

//定义一个公共的层级,只选定Layermask层内的碰撞器,其它层内碰撞器忽略。选择性碰撞

**public LayerMask mask;**

 

//也可以这样写:

// public LayerMask mask = 1 << 8;打开第8的层

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

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

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

 

    然后将if条件,改为以下代码,就可以实现穿透效果啦。mask即为选择的层,也就是只和mask层相撞,否则不撞,或穿透。

        **if (Physics.Raycast(ray, out hit, 500, mask))**

    效果如下。

 

     是不是很简单呢。可能很多童鞋看不懂LayerMask。下面就来细说一下它。

 

这篇博文主要的知识点就是对LayerMask的理解。

        LayerMask实际上是一个位码操作,在Unity3D中一共有32Layer层,并且不可增加。

 

 

    按位运算符:~|&^。位运算符主要用来对二进制位进行操作。

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

 

举个栗子

       var temp = 14 << 2; 表示十进制数14转化为二进制后向左移动2位。

       temp最后计算的值为14乘以2的平方,temp = 56

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

 

上面是个基础知识的补充。

   在Unity官方给出的描述是:Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些colliderCollision使用。

 

在代码中使用时如何开启某个Layers

LayerMask mask = 1 << 你需要开启Layers层。

LayerMask mask = 0 << 你需要关闭Layers层。

 

举几个栗子:

LayerMask mask = 1 << 2; 表示开启Layer2

LayerMask mask = 0 << 5;表示关闭Layer5

LayerMask mask = 1<<2|1<<8;表示开启Layer2Layer8

LayerMask mask = 0<<3|0<<7;表示关闭Layer3Layer7

上面也可以写成:

LayerMask mask = ~1<<3|1<<7;表示关闭Layer3Layer7

LayerMask mask = 1<<2|0<<4;表示开启Layer2并且同时关闭Layer4.

 

看了这些是不是就已经明白啦。

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页