【Unity】OnCollisionメソッドとは?衝突した際の処理を決める

OnCollisionメソッドとは? Unity

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

このページでは、

「UnityのOnCollisionメソッドってなに?」

「OnCollisionメソッドはどうやって使うの?」

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

Unityではオブジェクト同士が衝突した際に、OnCollisionを使って処理を行うことができます。

このOnCollisionメソッドは、オブジェクトが衝突したことを検知したタイミングで呼び出されるメソッドです。

そして、衝突のタイミングに合わせて、

  • OnCollisionEnter:衝突した瞬間
  • OnCollisionStay:衝突している間
  • OnCollisionExit:衝突し終わった瞬間

という3種類のメソッドがあります。

そこで、このページでは、Unityで使えるOnCollisionメソッドについて、どういうものなのか、使い方などをまとめていきます。

この記事を書いた人

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

OnCollisionメソッドとは?

まずは、OnCollisionメソッドがどういうものなのかを紹介していきます。

オブジェクトが当たった際に呼ばれるメソッド

OnCollisionメソッドは、冒頭でも解説した通り、オブジェクトが衝突した際に呼び出されるメソッドです。

このOnCollisionメソッドの中に処理を書いておくことで、衝突した際にゲーム内で行いたい処理を作ることができます。

例えば、

  • オブジェクトに当たったらオブジェクトの色を変更する
  • オブジェクトに触れたらプレイヤーのHPを減らす

など、オブジェクトに当たった際の処理を作ることができます。

なお、OnCollisionメソッドを呼び出す場合は、オブジェクトにRigidbodyコンポーネントColliderコンポーネントが付いている必要があります。

ColliderがCollisionモードの時に呼び出される

OnCollisionメソッドは、当たり判定を決めているColliderコンポーネントがCollisionモードの時にだけ呼び出されます。

もう少し簡単に言えば、Colliderコンポーネントにある「Is Trigger」にチェックが入っていないことが条件になります。

この「Is Trigger」は、オブジェクトが当たった際にすり抜けさせるかどうかを決めている項目で、OnCollisionメソッドはすり抜けずに衝突する場合にのみ呼び出されることになります。

そのため、OnCollisionメソッドを使う際は、Colliderの「Is Trigger」の項目にチェックを入れないようにしましょう。

なお、オブジェクトをすり抜けた際に処理をしたい場合は、OnCollisionではなくOnTriggerメソッドが準備されていますので、そのOnTriggerを使用するようにします。

衝突したタイミングで3種類ある

OnCollisionには、衝突した判定を検知するタイミングによって、以下の3つのメソッドが準備されています。

OnCollisionEnter:衝突した瞬間

OnCollisionEnterは、オブジェクト同士が衝突した瞬間の1回だけ呼び出されるメソッドです。

例えば、床に着地したタイミングで何かしらの処理を行いたいなどの時に、OnCollisionEnterメソッドを使います。

3Dゲームの場合は「OnCollisionEnter」、2Dゲームの場合は「OnCollisionEnter2D」をそれぞれ使用していきます。

OnCollisionStay:衝突している間

OnCollisionStayは、オブジェクト同士が衝突している間はずっと呼び出されるメソッドです。

例えば、ダメージを与える床などを作りたい場合は、OnCollisionStayを使うことで、その床にいる間はダメージを受けるといった処理を作ることができます。

こちらも3Dゲームの場合は「OnCollisionStay」、2Dゲームの場合は「OnCollisionStay2D」を使用していきます。

OnCollisionExit:衝突し終わった瞬間

OnCollisionExitは、オブジェクト同士が衝突し終わった瞬間の1回だけ呼び出されるメソッドです。

使う場面としては、オブジェクトが衝突した際にOnCollisionEnterによって何かしらの処理を起こした後、OnCollisionExitメソッドで離れた際にその処理を戻すといったようなことができます。

3Dゲームの場合は「OnCollisionExit」、2Dゲームの場合は「OnCollisionExit2D」を使用していきます。

OnCollisionメソッドの使い方

ここからは、OnCollisionメソッドの使い方について紹介していきます。

どちらのオブジェクトにもColliderを付けておく

まず、衝突させたいオブジェクトのどちらにもColliderコンポーネントを付けておきましょう。

このColliderコンポーネントは、オブジェクトを衝突させる範囲を決めているもので、お互いのCollider同士が当たることで、OnCollisionメソッドが呼び出されることになります。

Colliderコンポーネントを付ける際は、オブジェクトを選択してインスペクターウィンドウの「AddComponet」から、

  • 2Dゲームの場合は「Physics 2D」
  • 3Dゲームの場合は「Physics」

を選んで、オブジェクトに合わせてColliderコンポーネントを選択します。

また、Colliderコンポーネントの設定で、「Is Trigger」の項目がチェックされていないことも確認しておきましょう。

なお、オブジェクトを衝突させる際は、どちらか片方のオブジェクトにRigidbodyコンポーネントを付けておく必要があります。

このRigidbodyについては、以下の記事でも詳しく解説していますので、良かったら参考にしてみてください。

OnCollisionで当たった際の処理を書く

次に、OnCollisionメソッドを使って当たった際の処理を書いていきます。

例えば、2Dゲームでオブジェクトに衝突した瞬間に、コンソールウィンドウに「衝突した!」という表示を出す場合、オブジェクトに以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "yellowBall")
        {
            Debug.Log("衝突した!");
        }
    }
}

5行目に、オブジェクトと衝突した瞬間に呼び出されるOnCollisionEnter2Dを使っています。

OnCollisionEnter2Dの引数にCollision型の変数を設定していますが、これは衝突時の相対速度や相手のオブジェクト情報などを、この変数で取得することができるようになっています。

この引数の設定は、3Dでは「Collision 変数名」、2Dでは「Collision2D 変数名」となります。

なお、OnTriggerメソッドでは、この引数がCollider型と異なるため、注意しておきましょう。

このCollision型の変数を使って、7行目にif文で特定の名前のオブジェクトと衝突した時だけ、処理を行うように記述しています。

これで実際にゲームを実行してみると、

オブジェクトが衝突した瞬間に「衝突した!」という表示が出ています。

これで、オブジェクトが衝突した際の処理を作ることができました。

まとめ

このページでは、UnityのOnCollisionメソッドについて、どんな特徴や仕様があるのか、また使い方までを紹介していきましたが、いかがでしたでしょうか?

OnCollisionメソッドは、オブジェクトが衝突したことを検知したタイミングで呼び出されるメソッドです。

このOnCollisionを使うことで、特定のオブジェクトと衝突した際の処理を作っていくことができます。

また、オブジェクトとの衝突タイミングに合わせて、

の3種類のメソッドが準備されています。

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

コメント