【Unity, Collision, Trigger】衝突したオブジェクトを破壊する「OnCollisionEnter」「OnTriggerEnter」

はじめに
この記事ではUnityの「Collider」を使った衝突判定を使って、衝突したオブジェクトを破壊する方法を紹介します。
Collisionを使った衝突判定
CollisionはColliderコンポーネントをアタッチしているオブジェクトと接触した時に処理を行います。
void OnCollisionEnter(Collision collision){}のように記入してください。
注意点ですが、OnTriggerEnterの引数は「Collider型」でしたが、
OnCollisionEnterでは「Collision型」を引数に使用してください。
内部でFixedUpdate()の処理を行っているので、
Update()などの関数に入れなくても、連続して処理を行ってくれます。
使用するには、衝突する方かされる方のどちらかに「Rigidbody」をアタッチする必要があります。
今回は以下のように、Cubeに「Rigidbody」と「Script」をアタッチして、
Sphere へぶつけてみます。
Collision系の関数
Collision系の関数には以下の3種類があります。
-
OnCollisionEnter:接触した瞬間に実行
-
OnCollisionStay:接触中に実行
-
OnCollisionExit:接触から離れたときに実行
以下のコードを記入して、Cubeにアタッチしてください。
また、衝突する方とされる方、少なくともどちらかにRigidbodyをアタッチしてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("接触");
}
void OnCollisionStay(Collision collision)
{
Debug.Log("接触中");
}
void OnCollisionExit(Collision collision)
{
Debug.Log("離脱");
}
}衝突した方のオブジェクトを破壊する
今回は接触した瞬間にオブジェクトを破壊するスクリプトを作成します。
OnCollisionEnter(Collision collision)内のメソッドに、
Debug.Log("衝突したオブジェクト:" + gameObject.name);
Debug.Log("衝突されたオブジェクト:" + collision.gameObject.name);
と記入しました。
「gameObject.name」で、スクリプトをアタッチしたオブジェクトの名前を取得します。
引数のcollisionは、衝突された方のcollisionを指しているので、
「collision.gameObject.name」で、衝突された方のオブジェクトの名前を取得します。
これを利用して、Destroy(gameObject);で衝突したオブジェクトをヒエラルキーから排除できます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("衝突したオブジェクト:" + gameObject.name);
Debug.Log("衝突されたオブジェクト:" + collision.gameObject.name);
Destroy(gameObject);
}
}衝突された方のオブジェクトを破壊する
逆に、Destroy(collision.gameObject);で衝突された方のオブジェクトをヒエラルキーから排除できます。
これらを応用すれば、gameObjectの後ろに「.GetComponent」や「.translate」などをつければ、
様々な関数を利用できます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("衝突したオブジェクト:" + gameObject.name);
Debug.Log("衝突されたオブジェクト:" + collision.gameObject.name);
Destroy(collision.gameObject);
}
}Triggerを使った衝突判定
TriggerはColliderコンポーネントをアタッチしているオブジェクトと接触した時に処理を行います。
void OnTriggerEnter(Collider collision){}のように記入してください。
Collision系と違う点は、衝突したオブジェクトがコライダーを貫通する点です。
なので、ワープポイントやゴール地点などに使用します。
注意点ですが、OnCollisionEnterの引数は「Collision型」でしたが、
OnTriggerEnterでは「Collider型」を引数に使用してください。
次に、ゴール地点にしたい方のColliderコンポーネントの「Is Trigger」にチェックを入れてください。
今回は Sphere の「Is Trigger」にチェックを入れて、Cube を貫通させます。
Trigger系の関数
Trigger系の関数には以下の3種類があります。
-
OnTriggerEnter:接触した瞬間に実行
-
OnTriggerStay:接触中に実行
-
OnTriggerExit:接触から離れたときに実行
以下のコードを記入して、Cubeにアタッチしてください。
また、衝突する方とされる方、少なくともどちらかにRigidbodyをアタッチしてください。
これを実行すると、Cube が Sphere を貫通しながら衝突処理を行います。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(Collider Collider)
{
Debug.Log("接触");
}
void OnTriggerStay(Collider Collider)
{
Debug.Log("接触中");
}
void OnTriggerExit(Collider Collider)
{
Debug.Log("離脱");
}
}