レイヤー は、カメラ がシーンの一部のみを描画するために、また、ライト がシーンの一部のみを照らすためにもっとも頻繁に使用されます。しかし、レイキャスティングが選択的にコライダーを無視したり、 衝突 を発生させるためにも使用することができます。
まず最初に、新しいレイヤーを作成し、それを ゲームオブジェクト に割り当てます。新しいレイヤーを作成するには、Tags & Layers ウィンドウ (Edit > Project Settings を開き、Tags and Layers カテゴリを選択) を開きます。
空の User Layer の中から新規レイヤーを作成します。ここではレイヤー 8 を選択することにします。
新規レイヤーを作成したら、次にゲームオブジェクトの 1 つに割り当てます。
Tags and Layers ウィンドウで、Player レイヤーを Layer 8に割り当てます。
カメラのカリングマスクを使用して、特定の 1 つのレイヤーのオブジェクトのみをレンダリングできます。 そのためには、オブジェクトを選択的に描画するカメラを選択します。
Culling Mask プロパティーでレイヤーのチェックをつけたり外したりすることでカリングマスクの設定を変更することができます。
UI 要素はカリングされないことに注意してください。スクリーンスペースのキャンバスの子はカメラのカリングマスクの影響を受けません。
レイヤーを使用して、特定のレイヤーでレイキャストを行ったり、コライダーを無視することができます。 例えば 、Player レイヤーのみにレイキャストを行い、他のコライダーを無視することができます。
Physics.Raycast 関数はビットマスクを使用して、ビットごとにレイヤーを無視するかどうか判定することができます。 layerMask (レイヤーマスク)のすべてのビットが有効である場合は、すべてのコライダーと衝突します。 もし layerMask = 0 の場合、レイがコライダーに衝突することはありません。
int layerMask = 1 << 8;
//プレイヤーレイヤーにあるオブジェクトとレイが交差するかどうか。
if(Physics.Raycast(transform.position、Vector3.forward、Mathf.Infinity、layerMask))
{
Debug.Log("The ray hit the player");
}
この逆を行いたい場合もあります。Player レイヤー以外のすべてのコライダーに対してレイキャストを行います。
void Update ()
{
// ビットマスクを取得するためにレイヤー 8 のインデックスをビットシフトします。
int layerMask = 1 << 8;
// レイヤー8 のコライダーに対してのみレイを投影します。
// 代わりに、レイヤー8 以外のすべてと衝突させたい。~ 演算子はこれを行い、ビットマスクを反転します。
layerMask = ~layerMask;
RaycastHit hit;
// プレイヤーレイヤーを除くすべてのオブジェクトとレイが交差するかどうか
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 レイヤーのコライダーのみ無視します。 レイキャストを行うときに一部のコライダーを無視するにはこれがもっとも簡単です。
注意 Layer 31 は内部的にエディターの Preview ウィンドウ機能によって使用されます。クラッシュを避けるために、このレイヤーを使用しないでください。
2017–05–08 Page amended
カリングマスクの情報は Unity 2017.1 で更新