【Unity】OnTriggerとは?当たり判定の処理を行うメソッド

OnTriggerとは? Unity

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

このページでは、

「UnityのOnTriggerがどういうものなのか知りたい!」

「OnTriggerってどんなときに使うの?」

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

Unityで当たり判定の処理を決める際に、よく使われるのがOnTriggerメソッドです。

OnTriggerは、Unityでオブジェクト同士が当たった際に呼び出されるメソッドになっています。

このOnTriggerメソッド内に処理を書いてあげることで、ゲーム内で当たった際にどのような処理を行うかを決めることができます。

このページでは、Unityで当たり判定を行う際の処理で使うOnTriggerについて、どんな仕組みなのか、使い方などをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

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

この記事を書いた人

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

OnTriggerとは?

まずは、OnTriggerがどういうものなのか、簡単に説明していきます。

オブジェクト同士が当たった際に呼び出されるメソッド

OnTriggerは、オブジェクト同士が当たった際に呼び出されるメソッドになっています。

このメソッドに、当たった際の処理を書いておくことで、例えば、

など、様々な処理を加えることができます。

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

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

OnTriggerが呼び出されるのは、オブジェクトに設定しているColliderコンポーネントがTriggerモードの時だけになっています。

このTriggerモードとは、そのオブジェクトに当たってもすり抜けるようになる設定のことで、Colliderの設定にある「Is Trigger」のチェックを入れることで、Triggerモードになります。

オブジェクト同士を当てて反発させるなどの処理を行わず、当たり判定だけの処理をしたい場合は、TriggerモードにしてこのOnTriggerメソッドを使うことになります。

当たり判定を検知するタイミングでメソッドが変わる

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

OnTriggerEnter:当たった瞬間に呼び出される

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

例えば、相手からの攻撃がプレイヤーに当たってライフを減らす、といった処理を作る際に、OnTriggerEnterメソッドを使います。

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

OnTriggerStay:当たっている間呼び出される

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

例えば、毒のステージを作ってそこにいる間はずっとダメージを受け続ける、といった当たり判定がある間、定期的に処理を行いたい場合はOnTriggerStayメソッドを使います。

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

OnTriggerExit:当たり終わった瞬間に呼び出される

OnTriggerExitメソッドは、オブジェクト同士が当たって離れる瞬間の1回だけ呼び出されるメソッドです。

使う場面としては、オブジェクトが当たった際にOnTriggerEnterによって何かしらの処理を起こして、OnTriggerExitメソッドで離れた際に戻すといった処理を行うことができます。

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

OnTriggerの使い方

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

なお、オブジェクトに対して、RigidbodyもColliderも付いている状況とします。

OnTriggerメソッド内に当たり判定の処理を書いていく

呼び出されるOnTriggerメソッド内に、当たり判定の処理を書いてあげることで、オブジェクトが当たった際にその処理を行う、ということができます。

例えば、

オブジェクトに当たるとダメージを受けてHPを1減らす

といった処理を行う場合は、当たった瞬間に処理を行いたいので、OnTriggerEnterメソッドを使って以下のようにスクリプトを書いていきます。

なお、今回は2Dゲームなので、OnTriggerEnter2Dと書いています。

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 10;    // HPの変数を宣言

    void OnTriggerEnter2D(Collider2D collision) // オブジェクトに当たった瞬間に呼び出される
    {
        hp--;   // HPを減らす処理
        Debug.Log("HP:" + hp);  // コンソールウィンドウにHPを表示
    }
}

7行目以降が、オブジェクトに当たった際の処理になっていて、OnTriggerEnter2D内でHPを減らすという処理を書いています。

実際に、このスクリプトをプレイヤーにアタッチしてオブジェクトに触れてみると、当たり判定がされてコンソールウィンドウでHPが減っているのが確認できます。

メソッドの引数に相手のColliderが渡される

先ほどのOnTriggerメソッドに、引数を受け取る設定がされていたと思います。

これは、OnTriggerメソッドが呼び出されるときに、当たった相手のオブジェクトにアタッチされているColliderが、引数として渡されているからです。

そのため、

2Dゲーム ⇒ 「Collider2D 変数名
3Dゲーム ⇒ 「Collider 変数名

と引数に書いてあげることで、その変数で相手のColliderを受け取ることができます。

特定の相手との当たり判定の処理を設定できる

受け取った相手のColliderから、オブジェクト名(gameobject.name)やオブジェクトに設定されているタグ(gameobject.tag)の情報を抽出することができます。

例えば、以下のように書いてあげることで、コンソールウィンドウに当たった相手のオブジェクト名が表示されていて、取得できているのが分かります。

using UnityEngine;

public class Test : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D collision) // collisionで相手のコライダーを取得
    {
        Debug.Log("相手のオブジェクト:" + collision.gameObject.name);  // コンソールウィンドウに相手のオブジェクト名を表示
    }
}

これを使って、if文などで条件を指定してあげることで、特定の相手との当たり判定の処理を書いていくことができます。

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 10;    // HPの変数を宣言

    void OnTriggerEnter2D(Collider2D collision) // collisionで相手のコライダーを取得
    {
        if (collision.gameObject.name == "enemy_A") // 相手が敵Aの場合
        {
            hp--;   // hpを1減らす処理
        }

        if (collision.gameObject.name == "enemy_B") // 相手が敵Bの場合
        {
            hp =- 2;   // hpを2減らす処理
        }
    }
}

OnTriggerを使う際の注意点

ここからは、OnTriggerを使って当たり判定の処理を作っていく際の注意点をまとめていきます。

オブジェクトにColliderとRigidbodyを付ける

記事内でも紹介していますが、オブジェクトに当たり判定の処理を行う場合、オブジェクトに対してColliderコンポーネントRigidbodyコンポーネントをアタッチしておく必要があります。

具体的には、当たり判定を行うオブジェクトのどちらにもColliderコンポーネントで当たり判定の範囲を決めて、どちらか片方にRigidbodyを付けておくことで、OnTriggerを使った当たり判定の処理を行うことができます。

OnTriggerメソッドを設定しているのに当たり判定の処理が行われていない場合は、オブジェクトにこれらのコンポーネントが付いていない場合がありますので、一度確認しておきましょう。

なお、当たり判定については以下の記事でまとめていますので、参考にしてみてください。

Collisionモード時はOnCollisionメソッドを使う

OnTriggerメソッドを使う際は、必ずColliderをTriggerモードにしてオブジェクトをすり抜けさせる必要があると、記事内で紹介しました。

このColliderの「Is Trigger」のチェックを外した場合はCollisionモードとなり、オブジェクト同士が当たった際にすり抜けなくなる設定になります。

Collisionモードの際には、OnTriggerメソッドではなく、OnCollisionメソッドというものを使用して、同じように衝突判定を行うことができます。

OnCollisionには、

の3つのメソッドがあり、それぞれの場合の処理を設定することができます。

そのため、

Triggerモードの当たり判定はOnTriggerメソッド
Collisionモードの当たり判定はOnCollisionメソッド

と覚えておくと良いでしょう。

まとめ

このページでは、Unityで当たり判定の処理を行う際に使うOnTriggerメソッドについて、使い方や注意点をまとめていきましたが、いかがでしたでしょうか?

OnTriggerメソッドは、オブジェクトをTriggerモードにした際に、他のオブジェクトとの当たり判定が起こると呼び出されるメソッドです。

OnTriggerメソッドには、

の3種類があり、それぞれの場合における処理を設定していくことができます。

当たり判定が起きた際に、相手のオブジェクトのColliderを取得することが出来るので、特定の相手と当たった際の処理などを設定しておくことで、当たり判定を制限することができます。

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

コメント