Unityでは、当たり判定の取得に使用する関数として以下の2種類を用意しています。
■OnCollision○○関数
ゲームオブジェクトが衝突した際に、反発する場合に実行される
| OnCollisionEnter | ゲームオブジェクト同士が接触したタイミングで実行 |
| OnCollisionStay | ゲームオブジェクト同士が接触している間、持続的に実行 |
| OnCollisionExit | ゲームオブジェクト同士が接触から離れたタイミングで実行 |
■OnTrigger○○関数
ゲームオブジェクトが衝突した際に、貫通する場合に実行される
| OnTriggerEnter | ゲームオブジェクト同士が接触したタイミングで実行 |
| OnTriggerStay | ゲームオブジェクト同士が接触している(重なっている)間、持続的に実行 |
| OnTriggerExit | ゲームオブジェクト同士が接触から離れたタイミングで実行 |
衝突時に反発するか貫通するかは、ColliderコンポーネントのIs Triggerの値によって決定されます。

| 衝突する側 | 衝突される側 | 結果 |
|---|---|---|
| Is Trigger ☑ | Is Trigger ☑ |
貫通 |
| Is Trigger ☑ | Is Trigger ☐ | |
| Is Trigger ☐ | Is Trigger ☑ | |
| Is Trigger ☐ | Is Trigger ☐ | 反発 |
両方のオブジェクトで Is Trigger が false(チェックが付いていない)の場合は反発し、それ以外の場合は貫通する、という挙動になります。
本記事では、ゲームオブジェクト同士が反発する際に実行される、OnCollision○○関数について解説していきます。
0.下準備
関数の説明に入る前に、まずは以下のような構成を用意しましょう。

各ゲームオブジェクトのコンポーネントは以下のようになっています。
※デフォルト値から変更した箇所のみ記載しています。
■3D Object > Plane
・Transform.Position の値変更

■3D Object > Cube
・Transform.Position の値変更

■3D Object > Sphere
・Transform.Position の値変更

・RigitBodyコンポーネント追加
(Add Component > Physics > RigitBody)
・Scriptコンポーネント追加
(Add Component > New Script)

今回はCubeとSphereを衝突させますので、両オブジェクトにColliderコンポーネントがアタッチされている必要があります(デフォルトでアタッチされています)。
また、少なくともどちらかのオブジェクトにはRigitBodyをアタッチする必要がありますので、ここではSphereにアタッチしています。
また、SphereにはScriptコンポーネントもアタッチしています。
スクリプトには以下の内容を記述しておきましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
// 中に記述された処理が一定間隔で繰り返し実行される
void Update() {
// もし入力したキーがSpaceキーならば、中の処理を実行する
if (Input.GetKey(KeyCode.Space)) {
// このオブジェクトのRigidbodyコンポーネントのAddForce関数を呼び出し
// Z軸方向に5.0fの力を、質量を考慮して瞬間的(ForceMode.Impulse)に加える
GetComponent<Rigidbody>().AddForce(0, 0, 5.0f, ForceMode.Impulse);
}
}
}
ゲームをスタートし、Spaceキーを押すことでSphereが動き出すことを確認しましょう。
ここからOnCollision○○関数の説明に入っていきますが、以降の説明で登場するスクリプトを記述する位置に注意してください。
public class NewBehaviourScript : MonoBehaviour
{
void Update() {
省略
}
// ↓ここから追記していく
}
1.OnCollisionEnter
OnCollisionEnterは、ゲームオブジェクト同士が接触したタイミングで実行される関数です。
SphereとCubeが衝突(接触)したタイミングでCubeが消えるようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触したタイミングで実行
void OnCollisionEnter(Collision collision)
{
// もし衝突した相手オブジェクトの名前が"Cube"ならば
if (collision.gameObject.name == "Cube") {
// 衝突した相手オブジェクトを削除する
Destroy(collision.gameObject);
}
}
ゲームをスタートし、Spaceキーを押してSphereを動かしましょう。
SphereとCubeと接触したタイミングで、Cubeが消えることが確認できましたでしょうか。
2.OnCollisionStay
OnCollisionStayは、ゲームオブジェクト同士が接触している間、持続的に実行される関数です。
SphereとPlaneが接触している間は、Sphereの色がランダムに変化するようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触している間、持続的に実行
void OnCollisionStay(Collision collision)
{
// もし接触している相手オブジェクトの名前が"Plane"ならば
if (collision.gameObject.name == "Plane"){
// このオブジェクトのRendererコンポーネントのmaterialの色をランダムに変更する
// new Color(赤:0~1, 青:0~1, 緑:0~1, 透明度:0~1);
GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value, 1.0f);
}
}
ゲームをスタートさせると、Sphereの色が変化していく様子が確認できるかと思います。
3.OnCollisionExit
OnCollisionExitは、ゲームオブジェクト同士が接触から離れたタイミングで実行される関数です。
SphereとPlaneが接触から離れたタイミングでSphereの色が白に変わるようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触から離れたタイミングで実行
void OnCollisionExit(Collision collision)
{
// もし接触から離れた相手オブジェクトの名前が"Plane"ならば
if (collision.gameObject.name == "Plane"){
// このオブジェクトのRendererコンポーネントのmaterialの色を白に変更する
GetComponent<Renderer>().material.color = Color.white;
}
}
SphereがPlaneから落下するタイミングで、Sphereが白色になっていることが確認できます。