个人理解:
使用Layermask的好处:首先,layerMask是一个32位的掩码,32位掩码一个32位二进制数,每一位表示一个状态,对于layerMask这个状态就表示某一层的打开关闭状态,0表示关闭,1表示打开。
那么,为什么要使用掩码不直接使用十进制数呢?对于一个十进制整数,可以使用字典的方式存储状态,< 层数, 状态 > 比如要表示第8层的打开关闭状态,可能的函数就是传入一个整数8,然后在函数内设置字典
state[ 8 ] = true。那么要设置从第8层到第15层都打开,可能的代码就是
for( int i=8; i<=15; ++i ){
state[ i ] = true;
}
如果设置除了第8层,第15层,其它都关闭,那么就要调用复杂一点的函数。
从以上分析可以看出直接使用字典的方式存储每一层的状态设置起来比较繁琐。
而使用掩码,可以直接使用位操作设置,不需要调用任何复杂的函数。
比如:
设置第8层关闭
Camera.main.cullingMask &= ~(1<<8)。
这里直接使用与操作,对于与操作,0与数A结果为0,1与数A结果为数A,
对于第8层, 这里layerMask类中的32位值 = 0000 0000 0000 0000 0000 0001 0000 0000,
取反后为 1111 1111 1111 1111 1111 1110 1111 1111
将另一个这样二进制数与上面的32位二进制数与运算很明显被改变的只有第8层,因此只关闭第8层,其余层不改变状态。
如果直接设置Camera.main.cullingMask = 1111 1111 1111 1111 1111 1110 1111 1111显然这表示打开除了第8层以外的所有层。(0表示关闭状态,1表示打开状态)
如果要打开第8层:
使用或运算,1或A为1, 0或A为A
Camera.main.cullingMask |= (1<<8)。
如果事先不知道第8层的状态:
如果事先不知道第8层的状态,而仅仅是希望点击按钮就改变原先的状态,那么可以使用异或运算,(相异为1,相同为0)。
Camera.main.cullingMask ^= (1<<8)。参考上面的解释很容易理解.
参考:https://blog.csdn.net/qq_34562355/article/details/91876362