【Unity】OnTriggerを利用した当たり判定を理解しよう!
当たり判定を実装したいが思い通りに当たり判定が機能してくれない!という方もいるのではないでしょうか。
当たり判定にはさまざまな種類がありますが、今回はその中の一つのOnTriggerを使用した当たり判定についてご紹介します。
本記事では以下の流れで内容をご説明いたします。
- OnTriggerとは
- どのようなときに使える?
- OnTriggerEnterの使い方
- OnTriggerStayの使い方
- OnTriggerExitの使い方
- 3種類の比較
※本記事には「Unity-Chan」を使用しています。
© Unity Technologies Japan/UCL
参考ページ)ユニティちゃん公式サイト
Contents
OnTriggerとは
そもそもOnTriggerってなに?という方向けに簡単にご説明いたします。
OnTriggerとは特定オブジェクトがトリガーとなるオブジェクト領域に接触、侵入、脱出したときにイベントを発生させることができるものです。
↓イメージ図
また、OnTriggerを使用するためにはトリガーとなるオブジェクトのコライダーの「Is Trigger」にチェックを入れなければ使用することができません。
↓IsTriggerにチェックを入れる
このIsTriggerにチェックを入れたオブジェクトは物理的に接触することができません。これがOnTriggerを使用するときの大きなメリットとなります。
↓IsTriggerにチェックを入れていないCubeにはぶつかる
↓IsTriggerにチェックを入れたCubeはすり抜ける
もう一点重要なことがあります。
それは特定オブジェクトもしくはトリガーオブジェクトのどちらかに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を設置してください。
↓マテリアルを設定してあると見やすいです
次に動くユニティちゃんを設置します。このときメインカメラをユニティちゃんの子オブジェクトに設定して追従できるようにしてください。
↓ユニティちゃん設置
詳しい方法は以下記事をご参考ください。
作成したユニティちゃんのタグをPlayerに設定します。
ヒエラルキービューでunitychanを選択してインスペクタービューのタグをPlayerに設定してください。
↓プレイヤータグ設定
次にトリガーとなるCubeオブジェクトを作成します。
ヒエラルキービューのCreateからCubeを作成してください
↓Cube作成
キューブの位置はユニティちゃんと少し離れた位置にするように設定してください。
↓キューブとユニティちゃんの距離感
作成したキューブのCubeColliderのIsTriggerにチェックを入れてください。
↓IsTriggerにチェックを入れる
以上で下準備は完了です。
OnTriggerEnter
まずはじめにOnTriggerEnterの使用方法について解説します。
OnTriggerEnterはトリガーオブジェクトが特定オブジェクトに侵入した瞬間のみ呼び出されます。
↓イメージ図
それでは実際にOnTriggerEnterをスクリプトに記述してみましょう。
プロジェクトビューでスクリプトを作成してください。名前は任意ですが今回は「OnTriggerSample」とします。
↓スクリプト作成
作成したスクリプトを開いて以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class OnTriggerSample : MonoBehaviour { //OnTriggerEnter関数 //接触したオブジェクトが引数otherとして渡される void OnTriggerEnter(Collider other) { //接触したオブジェクトのタグが"Player"のとき if(other.CompareTag("Player")){ //オブジェクトの色を赤に変更する GetComponent<Renderer>().material.color = Color.red; } } } |
プログラムについて解説していきます。
まずOnTriggerEnter関数はトリガーとなるオブジェクトが他のオブジェクトと接触した瞬間に呼び出されます。
1 |
void OnTriggerEnter(Collider other) |
引数otherには接触してきたオブジェクトのコライダーが渡されます。
この渡されたotherのタグをif文で判定することで特定オブジェクトと接触したときの処理を実行できます。
1 |
if(other.CompareTag("Player")) |
ここではcompareTagを使用してotherのタグがPlayerかどうかを判定します。
接触したオブジェクトがPlayerタグの時にif文の中身が実行されます。
1 |
GetComponent<Renderer>().material.color = Color.red; |
GetComponentでRendererを取得してmaterial.colorの値をColor.redに変更しています。
これによってトリガーオブジェクトの色が赤に変わります。
以上がプログラムの概要です。
ではスクリプトをCubeオブジェクトに設定してから実行してみましょう。
↓スクリプトをCubeにドラッグ&ドロップで設定する
それでは実際に実行して確認してみましょう。
Cubeが赤に変わったことが確認できました。
OnTriggerStay・OnTriggerExitの使い方
次にOnTriggerStay・OnTriggerExitの使い方を同時に解説します。
同時に記述した方がそれぞれの機能がわかりやすいのでこのセクションで同時に説明いたします。
基本的な部分は先ほどのOnTriggerEnterと変わりませんが、OnTriggerStay関数は特定オブジェクトとトリガーオブジェクトが接触している間ずっと呼び出されます。
対してOnTriggerExit関数は特定オブジェクトとトリガーオブジェクトが離れた瞬間に呼び出されます。
↓OnTriggerStayイメージ図
↓OnTriggerExitイメージ図
それでは先ほど作成したスクリプトを変更して実際の動きを確認してみましょう。
OnTriggerSampleスクリプトを以下のように変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class OnTriggerSample : MonoBehaviour { //OnTriggerStay関数 //接触したオブジェクトが引数otherとして渡される void OnTriggerStay(Collider other) { //接触しているオブジェクトのタグが"Player"のとき if(other.CompareTag("Player")){ //オブジェクトの色を赤に変更する GetComponent<Renderer>().material.color = Color.red; } } //OnTriggerExit関数 //離れたオブジェクトが引数otherとして渡される void OnTriggerExit(Collider other) { //離れたオブジェクトのタグが"Player"のとき if(other.CompareTag("Player")){ //オブジェクトの色を赤に変更する GetComponent<Renderer>().material.color = Color.yellow; } } } |
プログラムは使用する関数がOnTriggerExitとOnTriggerStayであるかどうかの違いしかありません。
ここではStayが呼び出されるときオブジェクトの色を赤にして、Exitが呼び出されるときにオブジェクトの色を黄色にしています。
↓実行結果
実際に実行できていることが確認できました。
3種類の比較
最後に全ての処理を一つのスクリプトに記述して、呼び出されるタイミングを改めて確認してみましょう。
先ほど作成したOnTriggerSampleを以下のように変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class OnTriggerSample : MonoBehaviour { //onTriggerEnter関数 //接触したオブジェクトが引数otherとして渡される void OnTriggerEnter(Collider other) { //接触しているオブジェクトのタグが"Player"のとき if (other.CompareTag("Player")) { //オブジェクトを少しだけ持ち上げる transform.position = new Vector3(transform.position.x , transform.position.y + 0.2f , transform.position.z); } } //OnTriggerStay関数 //接触したオブジェクトが引数otherとして渡される void OnTriggerStay(Collider other) { //接触しているオブジェクトのタグが"Player"のとき if(other.CompareTag("Player")){ //オブジェクトの色を赤に変更する GetComponent<Renderer>().material.color = Color.red; } } //OnTriggerExit関数 //離れたオブジェクトが引数otherとして渡される void OnTriggerExit(Collider other) { //離れたオブジェクトのタグが"Player"のとき if(other.CompareTag("Player")){ //オブジェクトの色を赤に変更する GetComponent<Renderer>().material.color = Color.yellow; } } } |
プログラムのOnTriggerEnter部分のみ説明します。それ以外は先ほどと同じですのでそちらをご参考ください。
以下の記述でオブジェクトを少しだけ持ち上げます。
1 |
transform.position = new Vector3(transform.position.x , transform.position.y + 0.2f , transform.position.z); |
これはCubeのY座標の値に少しだけ値をプラスすることでオブジェクトの位置をずらしています。この0.2fの値を変化させれば持ち上がる量を変更することができますのでお好みで変更してください。
それでは実際に実行して確認してみましょう。
↓実行結果
接触した瞬間に少しだけ持ち上がり、接触している間だけ色が赤に変化、離れる瞬間に色が黄色に変化していることがわかると思います。
このように、OnTriggerを使用すれば接触した瞬間だけでなく、接触している間、離れる瞬間にもイベントを発生させることができます。
まとめ
いかがでしたでしょうか。
今回はOnTriggerについてご紹介してきました。
トリガーオブジェクトには物理的に接触することができない、さらには3種類の当たり判定方法があることをご理解いただけましたでしょうか。
この物理的に接触できないという特徴とOnTriggerの3種類の関数をうまく組み合わせてご自身のゲームにあった当たり判定を実装してみてください。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!