【初心者Unity】当たり判定の取り方②(ぶつからない編)
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(チェックが付いていない)の場合は反発し、それ以外の場合は貫通する、という挙動になります。
本記事では、ゲームオブジェクト同士が貫通する際に実行される、OnTrigger○○関数について解説していきます。
0.下準備
関数の説明に入る前に、まずは以下のような構成を用意しましょう。
各ゲームオブジェクトのコンポーネントは以下のようになっています。
※デフォルト値から変更した箇所のみ記載しています。
■3D Object > Plane
・Transform.Position の値変更
■3D Object > Cube
・Transform.Position の値変更
Sphere Collider Is Trigger True(チェックを付ける)
■3D Object > Sphere
・Transform.Position の値変更
・RigidBodyコンポーネント追加
(Add Component > Physics > RigidBody)
・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() { // このオブジェクトのTransformコンポーネントのPositionの値を変更する // Update()が実行される度に、Z座標の値を+0.01する this.transform.position += new Vector3(0, 0, 0.01f); } } }
ゲームをスタートし、Sphereが動き出すことを確認しましょう。
ここからOnCollision○○関数の説明に入っていきますが、以降の説明で登場するスクリプトを記述する位置に注意してください。
public class NewBehaviourScript : MonoBehaviour { void Update() { 省略 } // ↓ここから追記していく }
1.OnTriggerEnter
OnTriggerEnterは、ゲームオブジェクト同士が接触したタイミングで実行される関数です。
SphereとCubeが接触したタイミングで、Cubeが黒色になるようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触したタイミングで実行 void OnTriggerEnter(Collider other) { // もし衝突した相手オブジェクトの名前が"Cube"ならば if (other.name == "Cube") { // 衝突した相手オブジェクトのRendererコンポーネントのmaterialの色を黒に変更する other.GetComponent<Renderer>().material.color = Color.black; } }
2.OnTriggerStay
OnTriggerStayは、ゲームオブジェクト同士が重なっている間、持続的に実行される関数です。
SphereとCubeが重なっている間は、コンソールに”接触中!”のメッセージが出力されるようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触している(重なっている)間、持続的に実行 void OnTriggerStay(Collider other) { // もし接触している(重なっている)相手オブジェクトの名前が"Cube"ならば if (other.name == "Cube") { // コンソールに"接触中!"と表示 Debug.Log("接触中!"); } }
SphereがCubeを通過する間、コンソールビューに”接触中!”と表示されることを確認しましょう。
3.OnTriggerExit
OnTriggerExitは、ゲームオブジェクト同士が接触から離れたタイミングで実行される関数です。
SphereとCubeが接触から離れたタイミングで、Cubeの色が白色に変わるようなスクリプトを記述していきましょう。
// ゲームオブジェクト同士が接触から離れたタイミングで実行 void OnTriggerExit(Collider other) { // もし接触から離れた相手オブジェクトの名前が"Cube"ならば if (other.name == "Cube") { // 接触から離れた相手オブジェクトのRendererコンポーネントのmaterialの色を白に変更する other.GetComponent<Renderer>().material.color = Color.white; } }