1. 程式人生 > >Unity Layers與LayerMask理解

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");