Version: 2021.1
言語: 日本語
プレハブインスタンスの展開
レイヤーベースの衝突検出

レイヤー

Unity の レイヤー では、どのゲームオブジェクトが異なる機能やゲームオブジェクトと相互に作用するかを定義します。レイヤーは、 Cameras でシーンの一部だけをレンダリングしたり、 Lights でシーンの一部だけを照らすのにもっともよく使われます。また、レイキャスティングでコライダーを無視したり、衝突 を作成するためにも使用されます。

レイヤーの作成

まず最初に、新しいレイヤーを作成し、それを ゲームオブジェクト に割り当てます。新しいレイヤーを作成するには、Tags & Layers ウィンドウ (Edit > Project Settings を開き、Tags and Layers カテゴリを選択) を開きます。

空の User Layer の中から新規レイヤーを作成します。ここではレイヤー 8 を選択することにします。

レイヤーの割り当て

新規レイヤーを作成したら、次に、 1 つ、または複数のゲームオブジェクトに割り当てます。

各ゲームオブジェクトには、1 つのレイヤーしか割り当てることができません。

Tags and Layers ウィンドウで、Player レイヤーを Layer 8に割り当てます。

カメラのカリングマスクでシーンの一部だけを描画

カメラのカリングマスクを使用して、特定の 1 つのレイヤーのオブジェクトのみをレンダリングできます。 そのためには、オブジェクトを選択的に描画するカメラを選択します。

Culling Mask プロパティでレイヤーのチェックをつけたり外したりすることでカリングマスクの設定を変更することができます。

UI 要素はカリングされないことに注意してください。スクリーンスペースのキャンバスの子はカメラのカリングマスクの影響を受けません。

選択的なレイキャスト

レイヤーを使用して、特定のレイヤーでレイキャストを行ったり、コライダーを無視することができます。 例えば 、Player レイヤーのみにレイキャストを行い、他のコライダーを無視することができます。

Physics.Raycast 関数はビットマスクを使用して、ビットごとにレイヤーを無視するかどうか判定することができます。 layerMask (レイヤーマスク)のすべてのビットが有効である場合は、すべてのコライダーと衝突します。 もし layerMask = 0 の場合、レイがコライダーに衝突することはありません。

int layerMask = 1 << 8;

// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
{
    Debug.Log("The ray hit the player");
}

この逆を行いたい場合もあります。Player レイヤー以外のすべてのコライダーに対してレイキャストを行います。

void Update ()
{
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;

    // This would cast rays only against colliders in layer 8.
    // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
    layerMask = ~layerMask;

    RaycastHit hit;
    // Does the ray intersect any objects excluding the player layer
    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 レイヤーのコライダーのみ無視します。 レイキャストを行うときに一部のコライダーを無視するにはこれがもっとも簡単です。


  • 2017–05–08 修正されたページ

  • カリングマスクの情報は Unity 2017.1 で更新

プレハブインスタンスの展開
レイヤーベースの衝突検出