[Unity]レイヤーで当たり判定を制御する

当たり判定を行っていると、衝突を検出する組み合わせを意識することがあります。これをPhysicsを利用した判定ではスクリプトではなくUnityのエディタ上で設定することができます。

はじめに

ゲームを制作していると、例えば「ステージが背景と前景にわかれていて、背景の敵にダメージを与える弾と、前景の敵にダメージを与える弾を別にしたい」や「障害物にプレイヤーが接触すと進めないが、弾は通常どおり進む」などと当たり判定でも様々な条件がでてきます。これらはスクリプトですべて制御することもできますが、Unityが用意している仕組みを使ったほうが変更も容易です。

これらを実現するには「レイヤー」という仕組みを利用します。ペイントソフトなどで頻繁に用いるレイヤーと同じ概念ですが、Unityのレイヤーでは、レイヤーの分け方が柔軟で利用者に委ねられているところが大きいです。

公式のリファレンス・マニュアルの方が簡潔に書いていますので、ある程度Unityに慣れた人ならば、公式のマニュアルを読んだほうが楽だと思います。

http://docs-jp.unity3d.com/Documentation/Components/LayerBasedCollision.html

レイヤーベースの衝突検出 / Layer-Based Collision Detection.
http://docs-jp.unity3d.com/Documentation/Components/LayerBasedCollision.html

準備

オブジェクトの準備

配置

今回は簡単な条件を作り出すために以下のようなオブジェクトを配置しました。

  • Sphere
  • Cube
  • CubeRed
  • CubeBlue

カメラはシーン作成時のものをそのまま使い、暗ければ任意でライトを追加してくださ。

オブジェクトは以下の図のように配置してください。

layer-setting

色付け

赤と青のマテリアルを作成し、「CubeRed」に赤のマテリアルを、「CubeBlue」に青のマテリアルを適用します。

Rigidbodyの適用

Rigidbodyを適用して、ボールが落ちるようにします。

Sphereを選択し、メニューのComponent->Phisics->Rididbodyをクリックします。すると、InspectorにRigidbodyコンポーネントが追加されているはずです。この工程をCubeにも行ってRigidbodyコンポーネントを付加してください。

実行

これら上記の準備を行い、実行ボタンを押してください。間違っていなければ以下の図のように、SphereとCubeがCubeRedの上に落ちて、静止するはずです。もし、このようにならない場合は、もう一度工程をやりなおしてください。この段階でオブジェクトは以下の様な設定になっているはずです。

  • Sphere (Rigidbody付加)
  • Cube (Rigidbody付加)
  • CubeRed (赤マテリアル付加)
  • CubeBlue (青マテリアル付加)

layer-setting-run

レイヤーの設定

レイヤーの追加

レイヤーは、標準で7種類用意されていますが、自ら追加することができます。この場合、レイヤー番号は8番からになります。

どのオブジェクトでも良いので、選択すると、Inspectorの上部に「layer」というプルダウンメニューがあらわれます。

layer-pulldown

標準では、「Default」というレイヤーに属していることがわかりますね。このプルダウンメニューを押し、下部にある「AddLayer…」をクリックします。

addlayer

Inspectorにレイヤー一覧が表示されます。「User Layer」となっている部分が、ユーザーが自由に設定できるレイヤーです。以下の図のように、レイヤーを設定します。

  • User Layer 8 : Red
  • User Layer 9 : Bule
  • User Layer 10 : Sphere
  • User Layer 11 : Cube

layer-addlayer

オブジェクトにレイヤーを設定

レイヤーを追加し終えたら、オブジェクトにそれぞれレイヤーを設定します。レイヤーを設定したオブジェクトを選択し、Inspector上部のlayerと書かれたプルダウンメニューをクリックし、先ほど追加したレイヤーをクリックすることでレイヤーを設定することができます。以下の図はCubeオブジェクトをCubeレイヤーに設定した例です。

layer-setlayer

オブジェクトをそれぞれ以下のようにレイヤーを設定します。

  • Sphere (Sphereレイヤー)
  • Cube (Cubeレイヤー)
  • CubeRed (Redレイヤー)
  • CubeBlue (Blueレイヤー)

レイヤーの当たり判定条件の設定

メニューの「Edit」->「Project Settings」->「Physics」を選択するとInspectorに「PhysicsManager」が表示されます。ここでは物理シミュレーションの設定ができるのですが、当たり判定の設定は、ウインドウ下部にある「Layer Collision Matrix」で行います。下図のようにレイヤーの組み合わせが表示されているはずです。もし、表示されていない場合は、最小化されているので三角形の部分をクリックして展開してください。

layer-matrix

この行列で、項目が交じっているチェックボックスが接触判定に関する設定です。つまり、チェックが入っていれば接触を検出しますし、チャックがない場合は接触は検出されません。

今回は、「Sphere」は「CubeRed」と接触しない、「Cube」は「CubeBlue」と接触しないとします。そうなると、layer collision matrixは以下の図のような設定sになります。

layer-matrix-check

確認

実行し、確認してみましょう。以下のように「Sphere」は赤いオブジェクト「CubeRed」と接触しないはずです。

layer-result

おわりに

レイヤーの行列を使って接触の判定を設定できるのは一目瞭然で便利ですね。

[Unity]レイヤーで当たり判定を制御する” への1件のコメント

  1. ピンバック: [Unity] FF10エンカウントエフェクトを再現する [画面バラバラ] | きききろく

コメントは受け付けていません。