衝撃で壊す
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 10/71。
衝突の強さはどれくらいだったでしょうか? collision.relativeVelocityは、2つの物体がぶつかった瞬間に互いにどれだけの速さで接近していたかを表し、そのmagnitudeは衝突速度(m/s)です。これは速度の差です。同じ方向に8 m/sで進んでいる車に10 m/sの車がぶつかる場合、衝突速度はわずか2 m/sで、どちらの車から見ても衝突速度は同じです。
この卵は、crackSpeedを超える速さで着地すると割れます。1 mの高さから落とすと約4.4 m/s(2 x 9.81 x 1の平方根)で衝突し、2 mの高さからだと約6.3 m/sです。
public float crackSpeed = 5f;
void OnCollisionEnter(Collision collision)
{
if (collision.relativeVelocity.magnitude > crackSpeed)
{
Debug.Log("Splat!");
Destroy(gameObject);
}
}卵自身のrb.linearVelocityを使わないのはなぜでしょうか? OnCollisionEnterが実行される頃には、物理演算によって衝突はすでに処理されているため、卵の速度は衝突後に残った速度で、ほぼゼロです。relativeVelocityなら衝突そのものの速度を保てます。これは速さなので、質量は関係ありません。重い卵も軽い卵も、6 m/sで着地すれば、どちらも同じ6を示します。
チャレンジ
簡単Window.csを作成します。衝突するたびに窓が弱まり、0になると粉々に砕けます。
- 窓の
OnCollisionEnterで、strengthからcollision.relativeVelocity.magnitudeを引きます。 strength <= 0fになったら、Destroy(gameObject);を呼び出します。
「プレイ」を押し、上矢印キーで弱いボールを転がしてから、Spaceキーで強いボールを転がします。窓が割れます。次に「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Window : MonoBehaviour
{
public float strength = 10f;
// 衝突するたびに、その衝突速度の分だけstrengthが減少し、0になると窓が割れる
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド