現実の世界では、物と物がぶつかったときに、変化が起きる。これを、コンピューターで再現するには、ぶつかったこと(衝突)を知る必要がある。
衝突判定をしたいオブジェクトに 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になっている?
スピードが早すぎて判定をすり抜けていないか?
Unityでボールの跳ね返りを強くするには、主に**Physics Material(物理マテリアル)**というものを使用します。
以下に設定手順を説明します。
Projectウィンドウで右クリックし、Create > Physics Material (3Dの場合) または Physics Material 2D (2Dの場合) を選択します。
作成された新しいPhysics Materialに分かりやすい名前を付けます(例: BallBounceMaterial)。
作成したPhysics Materialを選択し、Inspectorウィンドウで以下の値を調整します。
Bounciness(弾性):
この値が跳ね返りの強さを決定します。
0 に設定すると、跳ね返りが全くなく、エネルギーが完全に失われます。
1 に設定すると、エネルギーの損失がない完全な跳ね返りになります(現実世界ではありえませんが、ゲームではよく使われます)。
跳ね返りを強くしたい場合は、この値を1に近づけてください。
Friction(摩擦):
摩擦の強さを決定します。ボールが地面や壁に当たったときにどれだけ滑るかに影響します。
跳ね返りを強くする目的では、摩擦は低い方が良い場合が多いです。0 に設定すると摩擦がなくなります。
Bounce Combine(跳ね返りの結合方法):
衝突する2つのオブジェクトがそれぞれPhysics Materialを持っている場合、どちらの跳ね返り設定を優先するかを決定します。
Maximum: 2つのPhysics Materialのうち、Bouncinessが高い方が優先されます。ボールの跳ね返りを強くしたい場合は、これを選択すると良いでしょう。
Average: 2つのBouncinessの平均値が適用されます。
Minimum: 2つのBouncinessの低い方が優先されます。
Multiply: 2つのBouncinessを掛け合わせた値が適用されます。
作成・設定したPhysics Materialをボールに適用します。
跳ね返りを強くしたいボールのゲームオブジェクトを選択します。
Inspectorウィンドウで、ボールにアタッチされているColliderコンポーネント(例: Sphere Collider、Capsule Colliderなど)を探します。
ColliderコンポーネントのMaterial(またはPhysics Material 2D)の項目に、先ほど作成したPhysics Materialをドラッグ&ドロップします。または、右端の丸いボタンをクリックしてリストから選択します。
Rigidbodyコンポーネント: ボールが物理演算によって跳ね返るためには、Rigidbody(またはRigidbody 2D)コンポーネントがアタッチされている必要があります。RigidbodyのMass(質量)やDrag(空気抵抗)も跳ね返りに影響を与える可能性がありますが、跳ね返りの強さ自体はPhysics MaterialのBouncinessが最も直接的に影響します。
衝突するオブジェクトのPhysics Material: ボールだけでなく、衝突する床や壁にもPhysics Materialを設定することで、より細かく跳ね返りを制御できます。例えば、壁のBouncinessを低くすることで、壁に当たるとあまり跳ね返らないようにすることも可能です。