Layer能够用于光照的分层和物理碰撞的分层,这样能够很好地进行性能优化性能优化
Layer在Unity中有3中呈现方式:一、string名字,二、int层索引,三、LayerMask数据数据结构
通常地,在编辑器中,咱们设置GameObject的Layer,是直接使用的层的名字,好比Default、UI等等。编辑器
而在代码中,使用的是GameObject的Layer属性,该属性是int型,取值在0到31之间,表明层索引,而且和名称一一对应。能够在Tags And Layers面板中设置对应关系(操做方法Editor->ProjectSetting->Tags And Layers)。性能
另外,咱们经常会使用到LayerMask结构定义字段,这样能够在编辑器中选择层。LayerMask的value属性虽然是一个int型,可是和GameObject的Layer属性不一样。顾名思义LayerMask.value是一种Mask(一般用二进制表示),他的取值为1<<0到1<<31,即2^0到2^31(<<为二进制左移运算符,即1的二进制左移31位,因此结果为2^31)。另一个LayerMask能够包含多个层,举个例子0x0001(1)表示1层,0x1001(9)表示第4层和第1层。优化
要达到这样表示多个层的效果,须要使用|运算(|为二进制或运算,0|1=1,0|0=0,1|0=1,1|1=1,即有1则1),反过来要想断定一个LayerMask中是否有指定的Mask只要使用&运算(&为二进制且运算,0&1=0,1&0=0,1&1=1,0&0=0,即有0则0)断定运算的结果是否为这个Mask值便可。举个例子好比0x1001&0x1000=0x1000,因此能够断定0x1001的Mask值中包含了0x1000这个Mask值。索引
上述了Unity的3种Layer的表示方法。在进行相互转化时可使用Unity提供的LayerMask操做的相关方法,即LayerMask. NameToLayer(string layername),能够将一个名称转化为一个int型层索引,或者LayerMask. LayerToName(int layerindex)。而将int型转化为LayerMask,则须要作移位操做。或者使用LayerMsk.GetMask(param string[] name)方法将一组名称直接转成一个LayerMaskstring
1<<GameObject.Layerit
1<<LayerMask. NameToLayer(“layer1”)| 1<<LayerMask. NameToLayer(“layer2”)二进制
或者方法
LayerMask.GetMask(“layer1”,”layer2”)
Return (layermask&1<<GameObject.Layer)==1<< GameObject.Layer
或者
Return (layermask&1<<GameObject.Layer)!=0
Return GameObject.Layer== LayerMask. NameToLayer(“layer”)