Unity之射线穿透

   一般的射线射中物体后就被阻挡了,假如碰到物体后,就会被拦截。如果我们想实现穿透某些物体,或者使射线不穿透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中一共有32个Layer层,并且不可增加。

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

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

举个栗子:

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

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

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

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

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

在代码中使用时如何开启某个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;表示开启Layer2和Layer8。

LayerMask mask = 0<<3|0<<7;表示关闭Layer3和Layer7。

上面也可以写成:

LayerMask mask = ~(1<<3|1<<7);表示关闭Layer3和Layer7。

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

看了这些是不是就已经明白啦。
--------------------- 
作者:黑色最低调的奢华 
来源:CSDN 
原文:https://blog.csdn.net/qq_36282052/article/details/70225549 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/chong90/article/details/84195943