先说说打开layer层窗口的两种方式
1.
2.
打开之后我们能看到如下面板
红框框住的0—7层已经被官方占用
绿框框住的我们可以自由使用
接着看一下Layer层碰撞矩阵的检测
这是碰撞矩阵的检测 不勾选的话这两种layer层的物体将不会再有碰撞
外部文件位置
相应的配置我们已经熟悉
下面熟悉一下原理和使用
我们首先要明确layer一共有32个一旦用完将无法再添加
unity中用int32表示32个layer层 所以layer一旦用完是没法添加的
因为32个layer用int32表示 所以32个layer的值应该分别是
0层 1层 2层 3层 4层 5层 6层 7层 8层 ......
1, 2, 4, 8, 16, 32, 64, 128, 256 ......
即:1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1<<8 ......
1 10 100 1000 10000 100000 1000000 10000000 100000000 ......
取反:(等下用代码动态删除的时候可以用到)
~1 ~2 ~4 ~8 ~16 ~32 ~64 ~128 ~256 ......
0 01 011 0111 01111 011111 0111111 01111111 011111111 ......
从代码控制相机添加照射层为:
m_camera.cullingMask |= layerMask;
比如现在有一个相机照射第一二层 此时想让它照射第三层就应该
m_camera.cullingMask |= 1<<3
此时m_camera.cullingMask= 1<<1|1<<2|1<<3 = 10|100|1000 = 1110;
从代码控制相机删除照射层为:
m_camera.cullingMask &= ~layerMask
如果我们此时不想让他照射第二层了就应该
m_camera.cullingMask &= ~4 4是100取反是011
此时m_camera.cullingMask= 1110&011 = 1010 = 10|1000
此时照射的是第一层和第三层就把第二层剔除了
当然直接使用数字在代码不但不好看 而且难懂 对此我们可以使用枚举的方式定义一下不同的layer层
例如:
public enum EM_CONST_LAYER {
GROUND = 1 << 8,
PLAYER = 1 << 9,
BOX = 1 << 10,
}
使用:
public void AddOrSubLayerToCamera(EM_CONST_LAYER m_CONST_LAYER, bool isAdd = true) {
if(isAdd)
m_camera.cullingMask |= (int)m_CONST_LAYER;
else
m_camera.cullingMask &= ~(int)m_CONST_LAYER;
}