UnityにはColliderというものを利用して当たり判定を簡単に取ることが出来ます。ここでは当たり判定がどういうタイミングで取れるかや、どのような点に注意すればいいかを説明します。
当たり判定に出来ること・タイミングや種類について
ゲームにおいて当たり判定は非常に重要な要素です。大体のゲームにおいて当たり判定を使わないゲームはないぐらい使われています。ここではゲーム内での使われ方ではなく、自分で当たり判定を使いこなすための手順を習得したいと思います。
当たり判定を取ることが出来る瞬間は主に3つのタイミング
当たり判定には3つのタイミングが存在します。飛んできたリンゴがキャラクターにぶつかった場合、以下のように例えることが出来ます。
タイミング | 説明 |
---|---|
Enter(当たった瞬間) | リンゴに接触した瞬間 連続して呼ばれることはありません |
Stay(触れている最中) | 当たったリンゴが離れるまでの間呼ばれ続けます。 すぐ離れた場合、呼ばれないことがあります |
Exit(離れた瞬間) | リンゴが跳ね返って離れた瞬間 連続して呼ばれることはありません |
EnterとExitは連続して呼ばれませんが、バスケットボールのドリブルをしているような状態になると高速でEnter-Exitが呼ばれることはあります。
実際にぶつかるCollisionと貫通するTrigger
また当たり判定にはCollisionモードとTriggerモードの2つの設定があります。Collisionモードは物理的な反応を行うことが出来る当たり判定で、Triggerモードは範囲内に入っているかどうかなどの当たり判定として利用出来ます。
体当りして壁にぶつかるのがCollisionモードで、壁の内側か外側かなどの判定を行うのがTriggerモードです。
種類 | 説明・例 |
---|---|
Collision | 跳ね返りなどを行う当たり判定 地面などキャラクターが踏める。 投げたボールが跳ね返るなど |
Trigger | 当たり判定の内側に入り込むことが出来る なにかのエリア内に出入りなどを |
3Dなのか2Dなのか
当たり判定を行うスクリプトやコンポーネントには3Dと2Dで使うものが変わります。コンポーネント側はある程度気づきやすいですが、スクリプトの方はたまに間違えることがあります。主に他の人のスクリプトを参考にしたときなど。
基本的には3D/2Dでやれることはだいたい同じなので、よく使ってる方と同じ事が別の方でも使えると思っていて大丈夫です。
当たり判定を行うために必要なコンポーネント構成・メソッド
当たり判定がどういったものかは理解できたと思います。では実際に当たり判定を行うための必要なUnity上での設定や、スクリプトの注意点などをまとめたいと思います。
当たり判定を行うメソッド・サンプルスクリプト
当たり判定を行うには、決められたメソッドを呼び出す必要があります。各メソッドは名前と引数が決まっており、当たり判定のタイミング・モードによって変わります。
タイミング | Collisionモード | Triggerモード |
---|---|---|
当たった瞬間 | void OnCollisionEnter(Collision) | void OnTriggerEnter(Collider) |
当たっている最中 | void OnCollisionStay(Collision) | void OnTriggerStay(Collider) |
離れた瞬間 | void OnCollisionExit(Collision) | void OnTriggerExit(Collider) |
表の中は3D版で、2D版はメソッドと引数にそれぞれ2Dが必要になります。
当たり判定を行うためのサンプルスクリプトは以下のようなものになります。サンプルはCollisionモード・3Dのものです。(Detector:検出器)
using UnityEngine;
public class HitDetector : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
Debug.Log("コリジョン-当たった瞬間");
}
private void OnCollisionStay(Collision collision)
{
Debug.Log("コリジョン-当たっている最中");
}
private void OnCollisionExit(Collision collision)
{
Debug.Log("コリジョン-当たらなくなった瞬間");
}
}
当たり判定を取るためのコンポーネント構成
スクリプトだけ出来てても動かないのがUnity。コンポーネントの構成が正しくないと当たり判定を取ることが出来ません。当たり判定を取るには基本的に3種類の構成しかありません。共通して言えるのは、片一方だけでも良いのでRigidbodyを付けておいて下さいということです。
検出したいオブジェクトオブジェクトのみにRigidBodyがある場合
両方にRigidBodyがある場合
検出したい相手側のみにRigidBodyがある場合
その他注意点など
以下は実際に使う際よく陥ったり疑問点になったりすることについて
引数の名前が違う
このサイトでのサンプルプログラムはcollisionとなっていますが、他のサイトだとotherになっています。いずれかにあわせる必要はありますか?
使いやすい名前のままで大丈夫です。引数は型さえあっていれば動作に問題はありません。使いやすい名前を採用して下さい
コメント