Layer
编辑器里的layer(总共32层):
就像PS里的图层,帮助你通过分层,层与层不会互相干扰。
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 的值,可以用位运算进行赋值。
比如 LayerMask mask = 1«3|0«5 表示开启Layer3并且同时关闭Layer5。
gameObject.layer
gameObject.layer 接收的是第几层,而不是位掩码的值。gameObject.layer = 6;将层设为6。
而LayerMask的值,会给你换算成掩码的int32值。
Physics.Raycast 等方法
Physics.Raycast(ray, out hit, 1000, 1<<LayerMask.NameToLayer("TestLayer"))
像 Physics.Raycast 等方法,接收的 LayerMask 是位掩码,假如我想检测第6层,填6,会变成检测 0110 ,第1层和第2层。所以要填 1 « 6 或者 64 或者对应的 LayerMask 对象。