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

#【基本】衝突を作る
<img width="870" alt="スクリーンショット 2019-05-10 11.08.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/cd37be0e-0074-b4fb-16ce-4ef684f8b681.png">
**衝突対象**
・衝突する側：アルパカ
・衝突される側：床

アルパカを重力で落下させ、床に乗せます。
衝突には、`Rigidbody 2D`と`Collider 2D`のコンポーネントが必要です。
##1.`Rigidbody 2D`をアタッチする
<img width="474" alt="スクリーンショット 2019-04-24 11.23.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/fa509c54-f722-e88d-ae3b-a3172bfb7433.png">
・`Rigidbody 2D`をアタッチすると、オブジェクトを物理演算(重力など)によって制御する事ができます。
・衝突させたいオブジェクトのどちらかにはアタッチする必要があります。
・今回は重力の影響を受けるアルパカにアタッチします。

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

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

##2.`Collider 2D`をアタッチする
<img width="471" alt="スクリーンショット 2019-04-24 12.03.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/28857c7b-3ddf-452a-8397-c6baadbf2ed5.png">
・`Collider 2D`をアタッチすると、オブジェクトに衝突判定を付与することができます。
・衝突する側、される側の両方にアタッチする必要があります。
・`Edit Collider`でオブジェクトを囲うように枠を設定します。
<img width="45" alt="スクリーンショット 2019-05-10 13.04.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/8fd82302-255b-d8d0-998f-d8f703819a9e.png">
※衝突に重要なプロパティ
・**Is Trigger** : OFF
　　ONにした場合、衝突が無くなり、オブジェクト同士がすり抜ける(侵入する)ようになります。

##3.実行する
<img width="872" alt="スクリーンショット 2019-04-26 12.01.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/07df8098-c083-d206-9142-667ba53803b1.png">
アルパカが重力で床と衝突し、乗ることを確認できました。
#【応用】スクリプトで衝突/侵入を利用する
オブジェクト同士が接触した際の処理を実装する場合、
`Collider 2D`の`Is Trigger`の状態(ON/OFF)によって使用(オーバーライド)するメソッドが異なります。

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

※`Collider 2D`をアタッチしたオブジェクト「いもむし」を追加して検証します。
<img width="65" alt="スクリーンショット 2019-05-13 12.31.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/807de6ed-eed6-2c39-ddad-67679b42d6e4.png">
##1.`Is Trigger`がOFF：OnCollision2D系のメソッド
###・OnCollisionEnter2D
　オブジェクトが接触(衝突)するタイミングで呼び出されます。
<img width="689" alt="スクリーンショット 2019-05-13 12.38.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/2e83b4c4-a251-1178-d20a-e3923a3fc19c.png">
<img width="681" alt="スクリーンショット 2019-05-13 12.35.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/7588c2a2-8469-0a73-253f-ffa571a7893b.png">

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

※`imomushi`タグを「いもむし」に設定し、「いもむし」との接触を検知してます
<img width="474" alt="スクリーンショット 2019-05-13 12.08.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/3e241495-eeac-7f48-3335-39c21f133c1a.png">
###・OnCollisionStay2D
　オブジェクトが接触(衝突)している間呼び出されます。
<img width="671" alt="スクリーンショット 2019-05-13 12.36.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/0ee40d03-3a17-f82d-8655-d8b40b128cfd.png">

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

###・OnCollisionExit2D
　オブジェクトが接触(衝突)状態から離れたタイミングで呼び出されます。
<img width="718" alt="スクリーンショット 2019-05-13 12.36.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/5c88e39c-7209-910f-6599-a3b18e09fb35.png">

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

##2.`Is Trigger`がON：OnTrigger2D系のメソッド
###・OnTriggerEnter2D
　オブジェクトが接触(侵入)するタイミングで呼び出されます。
<img width="689" alt="スクリーンショット 2019-05-13 12.38.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/30b1cb04-78c6-e2ab-e372-51fd3f56e84b.png">
<img width="676" alt="スクリーンショット 2019-05-13 12.30.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/66883031-f8be-ddb3-8aa2-fb4dd3e93598.png">

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

###・OnTriggerStay2D
　オブジェクトが接触(侵入)している間呼び出されます。
<img width="678" alt="スクリーンショット 2019-05-13 12.30.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/cf187da5-d960-5c24-8a4e-589994c71937.png">

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

###・OnTriggerExit2D
　オブジェクトが接触(侵入)状態から離れたタイミングで呼び出されます。
<img width="710" alt="スクリーンショット 2019-05-13 12.30.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297525/d59ea64b-7427-af1f-2921-cfab684938ce.png">

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