レイヤーを使用して、プロジェクトとワークフローを最適化できます。レイヤーの一般的な使用例は以下のとおりです。
カメラのカリングマスクを使用する場合は、特定のレイヤーまたは選択したレイヤーのオブジェクトのみを描画することができます。カリングマスクを変更するには、使用するカメラを選択し、Inspector ウィンドウで Culling Mask ドロップダウンを選択します。レイヤーのチェックボックスのチェックマークを消去すると、シーンに描画されません。
ノート: UI 要素とスクリーンスペースキャンバスの子はこれの例外であり、関係なく描画されます。
レイヤーを使用して、レイキャストが交差可能なゲームオブジェクトを指定できます。レイキャストでゲームオブジェクトを無視するには、Ignore Raycast レイヤーに割り当てるか、LayerMask をレイキャスト API 呼び出しに渡します。
レイキャスト API 呼び出しに LayerMask を渡さない場合、Unity は Ignore Raycast を除くすべてのレイヤーに一致する Physics.DefaultRaycastLayers を使用します。
Physics.Raycast 関数はビットマスクを使用して、各ビットでレイがレイヤーを無視するかどうかを決定します。layerMask のすべてのビットが有効である場合は、レイがすべてのコライダーと衝突します。layerMask = 0 の場合、衝突は発生しません。
例えば、レイヤー 8 にレイをキャストする場合は、以下のコードサンプルを参照してください。
int layerMask = 1 << 8;
// Does the ray intersect any objects which are in layer 8?
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
{
Debug.Log("The ray hit the player");
}
逆に、レイヤー 8 を除くすべてのレイヤーにレイを衝突させることができます。
void Update ()
{
// Bit shift the index of the layer (8) to get a bit mask
int layerMask = 1 << 8;
// This casts rays only against colliders in layer 8.
// But to collide against everything except layer 8, use the ~ operator because it inverts a bitmask.
layerMask = ~layerMask;
RaycastHit hit;
// Does the ray intersect any objects excluding layer 8.
if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask))
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
Debug.Log("Did Hit");
}
else
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
Debug.Log("Did not Hit");
}
}
ノート: Raycast 関数に layerMask を渡さない場合、IgnoreRaycast レイヤーを使用するコライダーを引き続き無視します。