对于参数LayerMask,我理解成了要检测的层ID。
因为手册里没有过多的说明,只知道是一个int,表示想要检测碰撞的层 。然而加了这个参数后,就完全检测不到碰撞了。终于找到原因,记录一下:
重点:这个int值不是表示Layer ID,而是表示LayerMask(图层遮罩),即“包含哪些图层,不包含哪些图层”
举个例子:我要检测在Layer【14: "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<
这个参数是一个奇妙的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射线基本使用和画线