【why】Physics2D.Raycast 的可选参数LayerMask使用后检测不到碰撞

对于参数LayerMask,我理解成了要检测的层ID。

因为手册里没有过多的说明,只知道是一个int,表示想要检测碰撞的层 。然而加了这个参数后,就完全检测不到碰撞了。终于找到原因,记录一下:

重点:这个int值不是表示Layer ID,而是表示LayerMask(图层遮罩),即“包含哪些图层,不包含哪些图层”

举个例子:我要检测在Layer【14: "Enemy"】发生的碰撞

  • 也就是说:
  • int LayerID = 14 
  • string LayerName = "Enemy"

错误用法:

  RaycastHit2D info = Physics2D.Raycast(transform.position, direction, distance, 14);

正确用法1

//使用Layer ID 
 RaycastHit2D info = Physics2D.Raycast(transform.position, direction, distance,  1<<14 );

正确用法2:

//使用Layer Name
int LayerID = LayerMask.NameToLayer("Enemy");
RaycastHit2D info = Physics2D.Raycast(transform.position, direction, distance, 
 1<

所以“ 1<<14" 是什么意思呢?

这个参数是一个奇妙的int值,仅用一个int参数,就表示了所有图层包含与否的设置。

用法举例:

1 << 14 表示仅包含14层(不包含其余的层)

~(1<<14) 表示不包含14层(包含其他所有层)

(1<<12) | (1<<14) 表示包含12、14层 (不包含其余层)

看懂了吗?没看懂的话继续往下看就明白了。

注意,这里的 1并不是表示图层号,不是“1到14层”的意思,而是一个开关。 1表示打开,0表示关闭。例如:

LayerMask mask = 1 << 14 ;  // 包含14号层

LayerMask mask = 0 << 14 ;  // 不包含14号层

符号 | 表示增加层。符号 ~ 表示反转(包含/不包含)。也可这样用:

LayerMask mask = 1 << 14 ;  

mask |= 1<< 15; // 再次添加了15号层。

mask = ~mask;  //反转,即:包含除14、15之外的所有图层

相关链接——关于射线的另一篇笔记:

Unity 2D射线基本使用和画线

你可能感兴趣的:(Unity,unity)