現実の世界では、物と物がぶつかったときに、変化が起きる。これを、コンピューターで再現するには、ぶつかったこと(衝突)を知る必要がある。
衝突判定をしたいオブジェクトに Colliderコンポーネントを追加する。Colliderコンポーネントは、三角、四角、丸などの形があり、形によって、衝突後の動きが変わってくる。
ColliderコンポーネントのIs Triggerの値で2つの方式がある。
衝突した際に、反発する場合に実行されるOnCollision○○関数 (Is Triggerチェックなし)
OnCollisionEnter関数 ゲームオブジェクト同士が接触したタイミングで実行
OnCollisionStay関数 ゲームオブジェクト同士が接触している間、持続的に実行
OnCollisionExit関数 ゲームオブジェクト同士が接触から離れたタイミングで実行
衝突した際に、貫通する場合に実行される OnTrigger○○関数(Is Triggerチェックあり)
OnTriggerEnter関数 ゲームオブジェクト同士が接触したタイミングで実行
OnTriggerStay関数 ゲームオブジェクト同士が接触している(重なっている)間、持続的に実行
OnTriggerExit関数 ゲームオブジェクト同士が接触から離れたタイミングで実行
2Dの場合は、Collider2D コンポーネントを使って、OnCollision○○2D関数あるいは、OnTrigger○○2D関数を使う。
衝突するオブジェクトが2つ以上ある場合は、Tagに名前を作成して、Tag名で判断する。
void OnCollisionEnter(Collision other)
{
//ボールにぶつかったとき
if (collision.gameObject.CompareTag("Ball"))
{
Debug.Log("ボールにぶつかった!");
}
}
Tagの付け方
InspectorのTagに設定する
右側の▼でメニューを開く
Add Tag... を選択してタグを作る
タグを追加して設定
Edit/Project Settinngs の Physics Settings にある Leyer Collison Matrixのチェックが外れている?
両方にRigidbodyは、存在する?
両方にColliderは、存在する?
関数にスペルミスが無いか?
IsTrigger のチェックとしょうとつ関数の組み合わせが合ってる?
当たり判定のどちらかのScaleが0になっている?
スピードが早すぎて判定をすり抜けていないか?