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」)