Texture Streaming API
レイヤーベースの衝突検出

レイヤー

レイヤー は、 カメラ によりシーンの一部のみレンダリングするために、また ライト はシーンの一部のみ照らすため、というように頻繁に使用されます。一方で部分的に、Collider を無視するあるいは レイヤーベースの衝突検出を発生させるためにも使用することができます。

レイヤーの作成

The first step is to create a new layer, which we can then assign to a GameObject. To create a new layer, open the Tags and Layers window (main menu: Edit > Project Settings, then select the Tags and Layers category).

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

レイヤーの割り当て

Now that you have created a new layer, you have to assign the layer to one of the GameObjects.

In the Tags and Layers window, the Player layer is assigned to layer 8.

Drawing only a part of the Scene with the Camera’s culling mask

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

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

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

選択的に Raycast する

レイヤーを使用して Raycast するときに特定のレイヤーのコライダーを無視することができます。 例えば Player レイヤーのみに Raycast して、他のオブジェクトを無視したい場合があるかもしれません。

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

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 レイヤー以外のすべてのコライダーに対して Raycast します。

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 レイヤーのコライダーのみ無視します。 Raycast するときにいくつかのコライダーを無視するにはこれがもっとも簡単です。

注意 Layer 31 は内部的にエディターのプレビューウィンドウメカニックによって使用されます。クラッシュを避けるために、このレイヤーを使用しないでください。


  • 2017–05–08 限られた 編集レビュー で修正されたページ

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

Texture Streaming API
レイヤーベースの衝突検出