一般的射线射中物体后就被阻挡了,假如碰到物体后,就会被拦截。如果我们想实现穿透某些物体,或者使射线不穿透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
版权声明:本文为博主原创文章,转载请附上博文链接!