概要
Unityでインタラクティブなゲームを作る上で、「何かが何かに触れた」という出来事を検知する仕組みは不可欠です。プレイヤーがアイテムに触れたら取得する、弾が敵に当たったらダメージを与える、特定のエリアに入ったらイベントが発生するなど、ゲーム内の多くのインタラクションは「接触」をきっかけに発生します。
Unityでは、こうした接触イベントを検知するために、OnCollisionEnterやOnTriggerEnterといった特殊なイベント関数が用意されています。これらは特定の条件 が満たされると自動的に呼び出される関数で、Unityのライフサイクルの一部です。この記事では、これらの物理イベント関数の違いと、それぞれの正しい使い方について詳しく解説していきます。
物理イベント vs トリガーイベント
Unityの接触イベントは、大きく分けて2種類あります。
- 物理イベント (Collision): オブジェクト同士が物理的に「衝突」したときに発生します。現実世界の衝突のように、オブジェクトは互いに跳ね返ったり、押し合ったりします。
OnCollision系の関数が対応します。 - トリガーイベント (Trigger): オブジェクトが特定の「領域」に侵入または退出したときに発生します。オブジェクトは互いにすり抜け、物理的な影響を与えません。
OnTrigger系の関数が対応します。
どちらのイベントを使うかは、実装したい挙動によって決まります。
- 壁や地面との衝突、ビリヤードの玉同士の衝突など、物理的な反発が必要な場合はCollisionを使います。
- アイテムの取得ゾーン、イベント発生エリア、ワープゾーンなど、物理的な反発が不要で、領域への出入りだけを検知したい場合はTriggerを使います。
Collisionイベントの使い方
Collisionイベントは、OnCollisionEnter, OnCollisionStay, OnCollisionExitの3種類があります。
| イベント関数 | 呼び出されるタイミング |
|---|---|
OnCollisionEnter(Collision other) | 他のColliderとの衝突が始まった瞬間に1回だけ呼ばれる。 |
OnCollisionStay(Collision other) | 他のColliderと接触している間、毎フレーム呼ばれ続ける。 |
OnCollisionExit(Collision other) | 他のColliderから離れた瞬間に1回だけ呼ばれる。 |
これらの関数は、引数としてCollisionクラスのインスタンスを受け取ります。このotherオブジェクトには、衝突に関する様々な情報(衝突相手のオブジェクト、衝突した位置、法線ベクトルなど)が含まれています。
using UnityEngine;
public class CollisionDetector : MonoBehaviour
{
// 他のオブジェクトと衝突した瞬間に呼ばれる
void OnCollisionEnter(Collision collision)
{
// collision.gameObjectで衝突相手のゲームオブジェクトにアクセスできる
Debug.Log(collision.gameObject.name + " と衝突しました!");
// 相手のタグが"Enemy"なら、自分自身を破壊する
if (collision.gameObject.CompareTag("Enemy"))
{
Destroy(gameObject);
}
}
}
Collisionイベントの発生条件
- 衝突する両方のオブジェクトが
Colliderコンポーネントを持っている。 - 衝突するオブジェクトの少なくとも一方が
Rigidbodyコンポーネントを持っている。
Triggerイベントの使い方
Triggerイベントを利用するには、まずColliderコンポーネントのIs Triggerプロパティにチェックを入れる必要があります。これにより、そのColliderは物理的な形状ではなく、イベントを発生させるための「領域」として扱われるようになります。
Triggerイベントも3種類あります。
| イベント関数 | 呼び出されるタイミング |
|---|---|
OnTriggerEnter(Collider other) | 他のColliderがトリガー領域に侵入した瞬間に1回だけ呼ばれる。 |
OnTriggerStay(Collider other) | 他のColliderがトリガー領域に留まっている間、毎フレーム呼ばれ続ける。 |
OnTriggerExit(Collider other) | 他のColliderがトリガー領域から退出した瞬間に1回だけ呼ばれる。 |
こちらの関数は、引数としてColliderクラスのインスタンスを受け取ります。otherには、領域に侵入してきた相手のColliderコンポーネントが渡されます。
using UnityEngine;
public class ItemCollector : MonoBehaviour
{
// 他のColliderがトリガー領域に侵入した瞬間に呼ばれる
void OnTriggerEnter(Collider other)
{
// other.gameObjectで侵入してきた相手のゲームオブジェクトにアクセスできる
Debug.Log(other.gameObject.name + " がアイテムゾーンに入りました。");
// 相手が"Player"タグを持っていたら、アイテム(自分自身)を非表示にする
if (other.CompareTag("Player"))
{
Debug.Log("アイテムを獲得!");
gameObject.SetActive(false);
}
}
}
Triggerイベントの発生条件
- イベントを発生させる両方のオブジェクトが
Colliderコンポーネントを持っている。 - 少なくとも一方のオブジェクトが
Rigidbodyコンポーネントを持っている。 - 少なくとも一方のオブジェクトのColliderで
Is Triggerが有効になっている。
その他のイベント関数
Unityには、物理イベント以外にも様々なイベント関数が用意されています。例えば、マウスカーソルがオブジェクトのCollider上にあるかどうかを検知するマウスイベントなどがあります。
OnMouseEnter(): マウスカーソルがColliderの上に乗った瞬間。OnMouseExit(): マウスカーソルがColliderの上から離れた瞬間。OnMouseDown(): Collider上でマウスボタンが押された瞬間。
これらはUI要素のインタラクションや、3Dオブジェクトをクリックして選択するような機能を実装する際に便利です。
まとめ
接触イベントは、ゲームにインタラクティブ性をもたらすための基本です。OnCollisionとOnTriggerの違いを正しく理解し、目的に応じて使い分けましょう。
- 物理的な反発が必要なら → Collision (
Is Triggerはオフ)。 - 領域への出入りだけを検知したい(すり抜けさせたい)なら → Trigger (
Is Triggerはオン)。 - どちらのイベントも、少なくとも一方のオブジェクトには
Rigidbodyが必要です。
これらのイベント関数をマスターして、プレイヤーのアクションに豊かに反応する、生き生きとしたゲーム世界を創造しましょう。