LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-13

【基本】衝突を作る

スクリーンショット 2019-05-10 11.08.37.png
衝突対象
・衝突する側:アルパカ
・衝突される側:床

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

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

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

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

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

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

スクリーンショット 2019-04-24 12.03.22.png
Collider 2Dをアタッチすると、オブジェクトに衝突判定を付与することができます。
・衝突する側、される側の両方にアタッチする必要があります。
Edit Colliderでオブジェクトを囲うように枠を設定します。
スクリーンショット 2019-05-10 13.04.40.png
※衝突に重要なプロパティ
Is Trigger : OFF
  ONにした場合、衝突が無くなり、オブジェクト同士がすり抜ける(侵入する)ようになります。

3.実行する

スクリーンショット 2019-04-26 12.01.24.png
アルパカが重力で床と衝突し、乗ることを確認できました。

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

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

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

Collider 2Dをアタッチしたオブジェクト「いもむし」を追加して検証します。
スクリーンショット 2019-05-13 12.31.03.png

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

・OnCollisionEnter2D

 オブジェクトが接触(衝突)するタイミングで呼び出されます。
スクリーンショット 2019-05-13 12.38.02.png
スクリーンショット 2019-05-13 12.35.44.png

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

imomushiタグを「いもむし」に設定し、「いもむし」との接触を検知してます
スクリーンショット 2019-05-13 12.08.31.png

・OnCollisionStay2D

 オブジェクトが接触(衝突)している間呼び出されます。
スクリーンショット 2019-05-13 12.36.07.png

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

・OnCollisionExit2D

 オブジェクトが接触(衝突)状態から離れたタイミングで呼び出されます。
スクリーンショット 2019-05-13 12.36.17.png

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

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

・OnTriggerEnter2D

 オブジェクトが接触(侵入)するタイミングで呼び出されます。
スクリーンショット 2019-05-13 12.38.02.png
スクリーンショット 2019-05-13 12.30.19.png

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

・OnTriggerStay2D

 オブジェクトが接触(侵入)している間呼び出されます。
スクリーンショット 2019-05-13 12.30.33.png

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

・OnTriggerExit2D

 オブジェクトが接触(侵入)状態から離れたタイミングで呼び出されます。
スクリーンショット 2019-05-13 12.30.44.png

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2