【Unity】当たり判定をPhysicsで簡単に作る方法

当たり判定の作り方 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityで当たり判定の作り方を知りたい。」

「敵と当たった時の処理を作りたいけど、どうすればいいの?」

というお悩みの方に向けた内容となっています。

ゲーム作りをしていると、オブジェクトに当たり判定を設定していく必要が出てきます。

当たり判定とは、オブジェクト同士が当たっているということを判定するもので、例えば

などの処理を行うことができるようになります。

Unityでは、この当たり判定を作る方法として、Physics(フィジックス)という物理演算システムの機能を使って簡単に作ることができます。

そこで、このページでは、Unityで当たり判定を作る方法と当たり判定を作る際の注意点について、まとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Physicsによる当たり判定の作り方

Unityでオブジェクトに当たり判定を作る際は、自分でスクリプトを書いて設定することもできます。

ただ、ある程度知識が必要なのと、当たり判定を設定するオブジェクトが多くなれば、その分書いていくことになるので大変です。

そこで、Unityの機能に含まれているPhysics(フィジックス)の物理演算システムを使って、当たり判定を設定していくことが多いです。

Physicsを使って当たり判定を作る際は、

  • Colliderコンポーネントをオブジェクトにアタッチする
  • Rigidbodyコンポーネントをオブジェクトにアタッチする
  • 衝突を検出するOnTriggerメソッドで処理を作る

という流れで作っていきます。

Colliderコンポーネントをオブジェクトにアタッチする

まず、当たり判定を行いたいオブジェクトと、衝突させたいオブジェクトのどちらにもColliderコンポーネントをアタッチさせておく必要があります。

Collider(コライダー)コンポーネントとは、衝突のためのオブジェクトの形状を決める役割を持っている機能のコンポーネントで、このColliderが設定してある箇所に、他のオブジェクトが当たることで、当たり判定を行うことができます。

Colliderコンポーネントには、様々な形状のコンポーネントが準備されていて、それぞれのオブジェクトごとに設定していくことができます。

以下は、主な形状のColliderコンポーネントです。

Collider名形状
Circle Colliderのコライダー
Box Collider四角いコライダー
Edge Colliderで自由に形を作れるコライダー
Polygon Collider多角形のコライダー

※2Dゲームの場合は、コライダー名の後ろに2Dが付けます。

Colliderコンポーネントの設定は、オブジェクトを選択してインスペクターウィンドウの「Add Component」をクリックします。

次に3Dゲームなら「Physics」、2Dゲームなら「Physics 2D」を選びます。

すると、それぞれの形状のColliderを選ぶことができます。

これでオブジェクトにColliderが設定されて、当たり判定の場所を特定できます。

例えば、以下は円形のCircle Colliderを使用した際の画面で、円形に囲われている部分に他のオブジェクトが当たると、当たり判定されます。

インスペクターウィンドウ、もしくはゲームビューの操作ツールからコライダーの大きさや位置を変えることができるので、以下のように頭だけに当たり判定を持たせるといったことができます。

キャラクターや敵、攻撃の弾、ステージの床など、当たり判定に関係するオブジェクトは全てColliderを設定しておきましょう。

なお、インスペクターウィンドウのColliderの項目に、「Is Trigger」というものがあり、当たったオブジェクトがすり抜けるかどうかを決めています。

  • チェックを付けるとTriggerモードとなりオブジェクトがすり抜ける
  • チェックを外すとCollisionモードとなりオブジェクトがすり抜けない

当たり判定を作るだけの場合は、Triggerモードにしておきましょう。

Rigidbodyコンポーネントをアタッチする

次に、当たり判定を作りたいオブジェクトにRigidbodyコンポーネントをアタッチしていきます。

Rigidbody(リジッドボディ)コンポーネントとは、オブジェクトに重力や摩擦係数を働かせるための機能を持つコンポーネントです。

当たり判定を作る際は、衝突させたいオブジェクトのうち、どちらか片方のオブジェクトにRigidbodyコンポーネントが付いている必要があります。

Rigidbodyコンポーネントの設定は、Colliderの時と同じく、オブジェクトを選択してインスペクターウィンドウの「Add Component」をクリックします。

次に、3Dゲームなら「Physics」、2Dゲームなら「Physics 2D」を選びます。

そして、「Rigidbody」もしくは「Rigidbody2D」をクリックすることで設定できます。

なお、Rigidbodyコンポーネントを付けると、重力機能が働いて、床が無いと自動的に落ちてしまいます。

この重力の影響を受けないようにしたい場合は、2DゲームではインスペクターウィンドウのRigidbody 2Dコンポーネントの設定にあるBody Typeを「Kinematic」にしておくことで、重力を無視することができます。

また、3Dゲームでは同じくインスペクターウィンドウのRigidbodyコンポーネントの設定にあるUse Gravityのチェックを外すか、Is Kinematicにチェックを入れることで、重力の影響を受けなくなります。

衝突を検出するOnTriggerメソッドで処理を作る

ColliderコンポーネントとRigidbodyコンポーネントをオブジェクトに付けてあげたことで、オブジェクト側の設定の準備は完了したので、次に当たり判定の処理をスクリプトで書いていきます。

オブジェクト同士が当たると、Triggerモードの場合は以下のOnTriggerメソッドが呼び出されることになるので、そこで行いたい処理内容をスクリプトに書いていくことで、当たり判定の処理を行うことができます。

※2Dゲームの場合は、メソッド名の後ろに2Dを付けます。

例えば、2Dゲームでプレイヤーがオブジェクトに当たったという判定を作りたい場合、プレイヤーにCircle Collider 2DRigidbody 2D、オブジェクトにBox Collider 2Dをアタッチします。

そして、以下のスクリプトをプレイヤーにアタッチします。

using UnityEngine;

public class Test : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D collider)  // オブジェクトが当たった瞬間
    {
        Debug.Log("当たった!"); // 当たり判定が起きた際の処理
    }
}

5~8行目でOnTriggerEnter2Dメソッドの処理を書いていて、今回はコンソールウィンドウに「当たった!」と表示させていますが、ここにダメージを受けたり、ライフを減らしたりという当たった際の処理を書いていくことになります。

なお、5行目で書いたOnTriggerメソッドは引数として、衝突相手のオブジェクトにアタッチされているColliderが渡されています。

実際に、ゲームを実行してプレイヤーをオブジェクトに当ててみると、コンソールウィンドウ上に「当たった!」という表記がされており、当たり判定を作ることができました。

Physicsで当たり判定を作る際の注意点

Physicsによって当たり判定を作ることができましたが、ここからは注意点を紹介していきます。

どちらかにRigidbodyコンポーネントが必要になる

記事内でも記載していますが、当たり判定を作る際はどちらかのオブジェクトにRigidbodyコンポーネントを付け忘れないようにしましょう。

Rigidbodyコンポーネントは、重力などの機能を追加させたい時に付けるものなので、重力機能を使わないゲームの場合は基本的に付けていないと思います。

しかし、当たり判定を作る際には、このRigidbodyコンポーネントが付いていないと判定を検出することが出来ないため、注意しておきましょう。

重力機能を持たせたくないけど当たり判定を行いたい場合は、2DゲームではBody Typeを「Kinematic」、3Dゲームでは「Is Kinematic」に変更しておきましょう。

同時に当たると処理が同フレームに複数回発生する

オブジェクトに当たり判定を持たせると、当たったらすぐに処理してくれますが、同時に当たる際は同フレーム内で処理が同時に行われるため注意が必要になります。

例えば、アクションゲームなどでよくありますが、

敵からダメージを受けたらライフを一つ減らして一定時間の間は無敵化

という処理を作ったとします。

通常であれば、一度ダメージを受けたらその後は一定時間ダメージを受けません。

しかし、同時に複数の敵のダメージを受けると、それぞれが同フレーム内で同時に処理を行うことになります。

そのため、同時に複数のダメージを受けると、ライフがその回数分減ってから無敵化してしまうため、想定と異なる挙動になることがあります。

もし、当たり判定のオブジェクトが多く同時にダメージを受けるようなゲームの場合は、ダメージの回数をカウントして当たり判定の処理制限を加えるなどを行っていく必要があります。

Collisionモードにすると跳ね返り挙動が付く

Colliderコンポーネントの部分で、Triggerモードともう一つCollisionモードがあると説明しました。

Collisionモードは、当たってもオブジェクトがすり抜けない設定になるので、ステージの床などに設定しておくことが多いです。

他にも、オブジェクトとオブジェクトを衝突させたら、跳ね返らせるなどの処理を行う際にCollisionモードを使っていくことで、実現することができます。

ColliderコンポーネントがCollisionモードになっているオブジェクトの衝突処理を作る場合は、以下のOnCollisionメソッドが呼び出されることになるので、そちらを使用していきます。

※2Dゲームの場合は、メソッド名の後ろに2Dを付けます。

まとめ

このページでは、Unityで当たり判定を作る方法について紹介していきましたが、いかがでしたでしょうか?

Unityでは、Physicsという機能を使うことで簡単に当たり判定を作ることができます。

具体的には、Physicsの中にあるColliderRigidbodyのコンポーネントをオブジェクトに付けてあげることで、当たったかどうかを判定することができます。

そして、当たった際に呼び出されるOnTriggerメソッドを使って、当たった時の処理を書いていくことで、ライフを減らしたりダメージを与えたりといった処理を行うことができます。

最後までお読みいただきまして、ありがとうございました!

コメント