【Unity】Physics(Rigidbody&Collider)で衝突を作る【2D】


【基本】衝突を作る


衝突対象
・衝突する側:アルパカ
・衝突される側:床

アルパカを重力で落下させ、床に乗せます。
衝突には、Rigidbody 2DCollider 2Dのコンポーネントが必要です。

1.Rigidbody 2Dをアタッチする


Rigidbody 2Dをアタッチすると、オブジェクトを物理演算(重力など)によって制御する事ができます。
・衝突させたいオブジェクトのどちらかにはアタッチする必要があります。
・今回は重力の影響を受けるアルパカにアタッチします。

※衝突に重要なプロパティ
Body Type : Dynamic
 ・物理演算で動くオブジェクトにはDynamicを設定します。
 ・スクリプトで動くオブジェクトにはKinematicを設定します。
 ・不動のオブジェクトにはStaticを設定します。
Simulated : ON
 ・OFFにした場合、物理演算がなくなり、衝突がなくなります。
Gravity Scale
 ・オブジェクトに掛かる重力を設定します。

※床にもRigidbody 2Dをアタッチする場合は、デフォルトの設定では床が重力を受けて落下する挙動になります。また、Gravity Scaleを0に設定しても、アルパカの着地の力を受けて落下する挙動になる為、Body TypeKinematicまたはStaticに設定する必要があります。

2.Collider 2Dをアタッチする


Collider 2Dをアタッチすると、オブジェクトに衝突判定を付与することができます。
・衝突する側、される側の両方にアタッチする必要があります。
Edit Colliderでオブジェクトを囲うように枠を設定します。

※衝突に重要なプロパティ
Is Trigger : OFF
  ONにした場合、衝突が無くなり、オブジェクト同士がすり抜ける(侵入する)ようになります。

3.実行する


アルパカが重力で床と衝突し、乗ることを確認できました。

【応用】スクリプトで衝突/侵入を利用する

オブジェクト同士が接触した際の処理を実装する場合、
Collider 2DIs Triggerの状態(ON/OFF)によって使用(オーバーライド)するメソッドが異なります。

使い分け
Is TriggerがOFF = 衝突:OnCollision2D系のメソッド
Is TriggerがON = 侵入:OnTrigger2D系のメソッド

Collider 2Dをアタッチしたオブジェクト「いもむし」を追加して検証します。

1.Is TriggerがOFF:OnCollision2D系のメソッド

・OnCollisionEnter2D

 オブジェクトが接触(衝突)するタイミングで呼び出されます。

OnCollisionEnter2D
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "imomushi")
        {
            Debug.Log("アルパカ「こんにちは」");
        }
    }

imomushiタグを「いもむし」に設定し、「いもむし」との接触を検知してます

・OnCollisionStay2D

 オブジェクトが接触(衝突)している間呼び出されます。

OnCollisionStay2D
    private void OnCollisionStay2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "imomushi")
        {
            Debug.Log("いもむし「こんにちは」");
        }
    }

・OnCollisionExit2D

 オブジェクトが接触(衝突)状態から離れたタイミングで呼び出されます。

OnCollisionExit2D
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "imomushi")
        {
            Debug.Log("アルパカ「さようなら」");
        }
    }

2.Is TriggerがON:OnTrigger2D系のメソッド

・OnTriggerEnter2D

 オブジェクトが接触(侵入)するタイミングで呼び出されます。

OnTriggerEnter2D
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "imomushi")
        {
            Debug.Log("アルパカ「こんにちは」");
        }
    }

・OnTriggerStay2D

 オブジェクトが接触(侵入)している間呼び出されます。

OnTriggerStay2D
    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject.tag == "imomushi")
        {
            Debug.Log("いもむし「君には僕が見えるのかい?」");
        }
    }

・OnTriggerExit2D

 オブジェクトが接触(侵入)状態から離れたタイミングで呼び出されます。

OnTriggerExit2D
    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.gameObject.tag == "imomushi")
        {
            Debug.Log("アルパカ「…(ぞわぞわ)」");
        }
    }