[Unity]Layer & LayerMask 简述

Posted by Rezzo on Saturday, February 19, 2022

Layer

编辑器里的layer(总共32层):

就像PS里的图层,帮助你通过分层,层与层不会互相干扰。

image.png

LayerMask

layer之所以是32层,是因为他是用int32表示,但是表示方法是:

0000 0000 0000 0000 0000 0000 0000 0000 

假如是第0层, 则表示为:

0000 0000 0000 0000 0000 0000 0000 0001 

假如是第5层, 则表示为:

0000 0000 0000 0000 0000 0000 0010 0000 

所以,是按位看的,从左往右第一位是1,就表示第0层,以此类推。

LayerMask就坑在这。

LayerMask mask = ~(1 << 9) ;// 打开除了第9之外的层。

所以LayerMask 的值,可以用位运算进行赋值。 image.png

比如 LayerMask mask = 1«3|0«5 表示开启Layer3并且同时关闭Layer5。

gameObject.layer

gameObject.layer 接收的是第几层,而不是位掩码的值。gameObject.layer = 6;将层设为6。

而LayerMask的值,会给你换算成掩码的int32值。

image.png

image.png

Physics.Raycast 等方法

Physics.Raycast(ray, out hit, 1000, 1<<LayerMask.NameToLayer("TestLayer"))

像 Physics.Raycast 等方法,接收的 LayerMask 是位掩码,假如我想检测第6层,填6,会变成检测 0110 ,第1层和第2层。所以要填 1 « 6 或者 64 或者对应的 LayerMask 对象。