【Unity】OnTriggerを利用した当たり判定を理解しよう!


当たり判定を実装したいが思い通りに当たり判定が機能してくれない!という方もいるのではないでしょうか。

当たり判定にはさまざまな種類がありますが、今回はその中の一つのOnTriggerを使用した当たり判定についてご紹介します。

本記事では以下の流れで内容をご説明いたします。

  • OnTriggerとは
  • どのようなときに使える?
  • OnTriggerEnterの使い方
  • OnTriggerStayの使い方
  • OnTriggerExitの使い方
  • 3種類の比較

被写体Unityちゃん

※本記事には「Unity-Chan」を使用しています。

© Unity Technologies Japan/UCL

参考ページ)ユニティちゃん公式サイト

OnTriggerとは

そもそもOnTriggerってなに?という方向けに簡単にご説明いたします。

OnTriggerとは特定オブジェクトがトリガーとなるオブジェクト領域に接触、侵入、脱出したときにイベントを発生させることができるものです。

↓イメージ図

トリガー説明図

また、OnTriggerを使用するためにはトリガーとなるオブジェクトのコライダーの「Is Trigger」にチェックを入れなければ使用することができません

↓IsTriggerにチェックを入れる

トリガーにチェック

このIsTriggerにチェックを入れたオブジェクトは物理的に接触することができません。これがOnTriggerを使用するときの大きなメリットとなります。

↓IsTriggerにチェックを入れていないCubeにはぶつかる

IsTriggerなし

↓IsTriggerにチェックを入れたCubeはすり抜ける

ISTriggerあり

 

もう一点重要なことがあります。

それは特定オブジェクトもしくはトリガーオブジェクトのどちらかにRigidbodyが設定されていないとOnTriggerが使用できないという点です。

このOnTriggerには全部で3種類存在しています。名称と機能を表にまとめましたのでご覧ください。

名称 機能
OnTriggerEnter
トリガーオブジェクトに侵入した瞬間呼び出される
OnTriggerStay
トリガーオブジェクトに侵入している間呼び出される
OnTriggerExit
トリガーオブジェクトから脱出した瞬間呼び出される

 

ここまでをまとめると、

  • OnTriggerはトリガーオブジェクトが特定オブジェクトに侵入、脱出したときにイベントを発生させる
  • トリガーオブジェクトはコラーダーのIsTriggerにチェックを入れなければ使用できない
  • IsTriggerにチェックを入れると物理的に接触することができない
  • 接触するオブジェクトのどちらかにRigidbodyを設定する
  • OnTriggerには3種類存在する

ここまでをご理解いただければこのセクションは問題ありません。

それではここから3種類のOnTriggerの使い方、違いを確認していきます。

今回はCubeオブジェクトをトリガーオブジェクトとします。特定オブジェクトにはユニティちゃんを使用します。

どのようなときに使える?

ではこのOnTriggerはどのようなときに使用するのが良いのでしょうか。

それは「物理的に接触しないオブジェクトとの当たり判定を実装したい」ときです。

前のセクションを理解していただければ当たり前だと感じてもらえるのではないでしょうか。

では物理的に接触しない、もしくは接触したくないオブジェクトとはどのようなものがあるでしょうか。

例を以下にまとめてみました。

  • ゴールライン
  • フィールド上のアイテム
  • FPSそのほかで使用する貫通する攻撃
  • 幽霊など透明なオブジェクト
  • すりぬけ可能な壁

少し考えただけでも様々なことに使用できることがわかるかと思います。

このように接触したくないが当たり判定は実行したいというときにOnTriggerは最適です。

逆に物理的に接触したい当たり判定にはOnCollisionを用います。

OnCollisionの当たり判定の方法は以下記事で詳しくご紹介しています。

参考記事)OnCollisionEnterの使い方

参考記事)OnCollisionStayの使い方

参考記事)OnCollisionExitの使い方

下準備

3種類のOnTriggerを使用するための下準備をします。

はじめにScaleの値をX,Y,Zそれぞれ100にしたPlaneを設置してください。

↓マテリアルを設定してあると見やすいです

Plane設置(マテリアル付き)

次に動くユニティちゃんを設置します。このときメインカメラをユニティちゃんの子オブジェクトに設定して追従できるようにしてください。

↓ユニティちゃん設置

ユニティちゃん設置

詳しい方法は以下記事をご参考ください。

参考記事)ユニティちゃんをノンプログラミングで動かす

作成したユニティちゃんのタグをPlayerに設定します。

ヒエラルキービューでunitychanを選択してインスペクタービューのタグをPlayerに設定してください。

↓プレイヤータグ設定

Playerタグ設定

次にトリガーとなるCubeオブジェクトを作成します。

ヒエラルキービューのCreateからCubeを作成してください

↓Cube作成

Cube作成

キューブの位置はユニティちゃんと少し離れた位置にするように設定してください。

↓キューブとユニティちゃんの距離感

キューブとユニティちゃんの距離感

作成したキューブのCubeColliderのIsTriggerにチェックを入れてください。

↓IsTriggerにチェックを入れる

トリガーにチェック

以上で下準備は完了です。

OnTriggerEnter

まずはじめにOnTriggerEnterの使用方法について解説します。

OnTriggerEnterはトリガーオブジェクトが特定オブジェクトに侵入した瞬間のみ呼び出されます。

↓イメージ図

OnTriggerEnter解説図

それでは実際にOnTriggerEnterをスクリプトに記述してみましょう。

プロジェクトビューでスクリプトを作成してください。名前は任意ですが今回は「OnTriggerSample」とします。

↓スクリプト作成

Script作成

作成したスクリプトを開いて以下のように編集してください。

プログラムについて解説していきます。

まずOnTriggerEnter関数はトリガーとなるオブジェクトが他のオブジェクトと接触した瞬間に呼び出されます。

引数otherには接触してきたオブジェクトのコライダーが渡されます。

この渡されたotherのタグをif文で判定することで特定オブジェクトと接触したときの処理を実行できます。

ここではcompareTagを使用してotherのタグがPlayerかどうかを判定します。

接触したオブジェクトがPlayerタグの時にif文の中身が実行されます。

GetComponentでRendererを取得してmaterial.colorの値をColor.redに変更しています。

これによってトリガーオブジェクトの色が赤に変わります。

以上がプログラムの概要です。

ではスクリプトをCubeオブジェクトに設定してから実行してみましょう。

↓スクリプトをCubeにドラッグ&ドロップで設定する

スクリプトをCubeに適用

それでは実際に実行して確認してみましょう。

OnTriggerEnter実行

Cubeが赤に変わったことが確認できました。

OnTriggerStay・OnTriggerExitの使い方

次にOnTriggerStay・OnTriggerExitの使い方を同時に解説します。

同時に記述した方がそれぞれの機能がわかりやすいのでこのセクションで同時に説明いたします。

基本的な部分は先ほどのOnTriggerEnterと変わりませんが、OnTriggerStay関数は特定オブジェクトとトリガーオブジェクトが接触している間ずっと呼び出されます。

対してOnTriggerExit関数は特定オブジェクトとトリガーオブジェクトが離れた瞬間に呼び出されます。

↓OnTriggerStayイメージ図

OnTriggerStay解説図

↓OnTriggerExitイメージ図

OnTriggerExitイメージ

それでは先ほど作成したスクリプトを変更して実際の動きを確認してみましょう。

OnTriggerSampleスクリプトを以下のように変更してください。

 

プログラムは使用する関数がOnTriggerExitとOnTriggerStayであるかどうかの違いしかありません。

ここではStayが呼び出されるときオブジェクトの色を赤にして、Exitが呼び出されるときにオブジェクトの色を黄色にしています。

↓実行結果

OnTriggerExit実行

実際に実行できていることが確認できました。

3種類の比較

最後に全ての処理を一つのスクリプトに記述して、呼び出されるタイミングを改めて確認してみましょう。

先ほど作成したOnTriggerSampleを以下のように変更してください。

 

プログラムのOnTriggerEnter部分のみ説明します。それ以外は先ほどと同じですのでそちらをご参考ください。

以下の記述でオブジェクトを少しだけ持ち上げます。

これはCubeのY座標の値に少しだけ値をプラスすることでオブジェクトの位置をずらしています。この0.2fの値を変化させれば持ち上がる量を変更することができますのでお好みで変更してください。

それでは実際に実行して確認してみましょう。

↓実行結果

3種類混ぜて実行

接触した瞬間に少しだけ持ち上がり、接触している間だけ色が赤に変化、離れる瞬間に色が黄色に変化していることがわかると思います。

このように、OnTriggerを使用すれば接触した瞬間だけでなく、接触している間、離れる瞬間にもイベントを発生させることができます。

まとめ

いかがでしたでしょうか。

今回はOnTriggerについてご紹介してきました。

トリガーオブジェクトには物理的に接触することができない、さらには3種類の当たり判定方法があることをご理解いただけましたでしょうか。

この物理的に接触できないという特徴とOnTriggerの3種類の関数をうまく組み合わせてご自身のゲームにあった当たり判定を実装してみてください。


この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!

Twitterはじめました @FuruiYuya