Unity Layers與LayerMask理解
LayerMask一般用於Physics.Raycast光線投射
先看下Raycast函式的引數
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
他還有很多過載函式
ray:射線的起點和方向
hitInfo:如果返回true,hitInfo將包含碰到器碰撞的更多資訊。
maxDistance:射線的長度。
layerMask:只選定Layermask層內的碰撞器,其它層內碰撞器忽略。
函式返回值為bool型別,當光線投射與任何碰撞器交叉時為真,否則為假。
Unity中的layer層使用Int32的32個位來表示每個層級
不能增加或減少,前面8個是引擎使用的,後面24個供開發人員使用,遊戲中的每一個物件都有layer屬性,預設值為Default
因此LayerMask實際上是用Int32的32個位來表示每個層級,當這個位為1時表示使用這個層,為0時表示不用這個層。
一般我們在射線時指向檢測某一個層時,這裡比如是“Game”層
我們通過LayerMask.NameToLayer("Game")獲取曾索引,在上圖中也就是16
,然後LayerMask mask = 1 << 16(等價於LayerMask.GetMask("Game"))就獲得了本次要檢測的層,即mask 就是當前Raycast函式中最後一引數的值
簡單來說:
LayerMask mask = 1 << 2; 表示開啟索引為2的層。
LayerMask mask = 0 << 5表示關閉索引為5的層。
LayerMask mask = ~(1 << 16) 開啟除了索引為16的層之外的層。
LayerMask mask = ~(1 << 0) 開啟所有的層。
(1 << 16) | (1 << 8) 開啟索引為10和索引為8的層。等價於LayerMask.GetMask(("Game", "Processing");