#【基本】衝突を作る
衝突対象
・衝突する側:アルパカ
・衝突される側:床
アルパカを重力で落下させ、床に乗せます。
衝突には、Rigidbody 2D
とCollider 2D
のコンポーネントが必要です。
##1.Rigidbody 2D
をアタッチする
・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
をアタッチする
・Collider 2D
をアタッチすると、オブジェクトに衝突判定を付与することができます。
・衝突する側、される側の両方にアタッチする必要があります。
・Edit Collider
でオブジェクトを囲うように枠を設定します。
※衝突に重要なプロパティ
・Is Trigger : OFF
ONにした場合、衝突が無くなり、オブジェクト同士がすり抜ける(侵入する)ようになります。
##3.実行する
アルパカが重力で床と衝突し、乗ることを確認できました。
#【応用】スクリプトで衝突/侵入を利用する
オブジェクト同士が接触した際の処理を実装する場合、
Collider 2D
のIs Trigger
の状態(ON/OFF)によって使用(オーバーライド)するメソッドが異なります。
使い分け
Is Trigger
がOFF = 衝突:OnCollision2D系のメソッド
Is Trigger
がON = 侵入:OnTrigger2D系のメソッド
※Collider 2D
をアタッチしたオブジェクト「いもむし」を追加して検証します。
##1.Is Trigger
がOFF:OnCollision2D系のメソッド
###・OnCollisionEnter2D
オブジェクトが接触(衝突)するタイミングで呼び出されます。
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "imomushi")
{
Debug.Log("アルパカ「こんにちは」");
}
}
※imomushi
タグを「いもむし」に設定し、「いもむし」との接触を検知してます
###・OnCollisionStay2D
オブジェクトが接触(衝突)している間呼び出されます。
private void OnCollisionStay2D(Collision2D collision)
{
if (collision.gameObject.tag == "imomushi")
{
Debug.Log("いもむし「こんにちは」");
}
}
###・OnCollisionExit2D
オブジェクトが接触(衝突)状態から離れたタイミングで呼び出されます。
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.tag == "imomushi")
{
Debug.Log("アルパカ「さようなら」");
}
}
##2.Is Trigger
がON:OnTrigger2D系のメソッド
###・OnTriggerEnter2D
オブジェクトが接触(侵入)するタイミングで呼び出されます。
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "imomushi")
{
Debug.Log("アルパカ「こんにちは」");
}
}
###・OnTriggerStay2D
オブジェクトが接触(侵入)している間呼び出されます。
private void OnTriggerStay2D(Collider2D other)
{
if (other.gameObject.tag == "imomushi")
{
Debug.Log("いもむし「君には僕が見えるのかい?」");
}
}
###・OnTriggerExit2D
オブジェクトが接触(侵入)状態から離れたタイミングで呼び出されます。
private void OnTriggerExit2D(Collider2D other)
{
if (other.gameObject.tag == "imomushi")
{
Debug.Log("アルパカ「…(ぞわぞわ)」");
}
}