別ベクトル方向にある場合のベクトル速度の大きさ
レイヤーベースの衝突検出

レイヤー

LayersCameras によりシーンの一部のみレンダリングするため,またLights によりシーンの一部のみ照らすため,などに最も頻繁に使用されます。一方で選択的に,Colliderを無視するあるいはCollisions を発生させるためにも使用することが出来ます。

レイヤーの作成

最初のステップは新規レイヤーを作成することで,次にそのレイヤーをGameObject に割り当てます。新規レイヤーを作成するにはEditメニューを開いてProject Settings->Tags を選択します。

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

レイヤーの割り当て

新規レイヤーは作成できたので,次にゲームオブジェクトの一つにアサインします。

Tag ManagerでPlayerレイヤーをレイヤー8に割り当てました。

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

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

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

選択的にRaycastする

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

Physics.Raycast関数はビットマスクをしようして,各々のビットで各レイヤーを無視するかどうか判定させることが出来ます。 layerMask(レイヤーマスク)の全てのビットが有効である場合は,全てのコライダと衝突します。 もしlayerMask = 0 の場合Rayによりコリジョンすることがありません。

// JavaScript example.

// bit shift the index of the layer to get a bit mask
var 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))
    print ("The ray hit the player");


// C# example.

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します。

// JavaScript example.
function Update () {
  // Bit shift the index of the layer (8) to get a bit mask
  var 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;

  var hit : RaycastHit;
  // Does the ray intersect any objects excluding the player layer
  if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    print ("Did Hit");
  } else {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    print ("Did not Hit");
  }
}


// C# example.
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するときにいくつかのコライダを無視するにはこれが最も簡単です。

別ベクトル方向にある場合のベクトル速度の大きさ
レイヤーベースの衝突検出