衝撃で壊す
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 10/63。
衝撃はどれほど強かったでしょうか? 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を示します。
チャレンジ
簡単ボールは窓に向かって転がります。上矢印キーでゆっくり、Spaceで強く転がします(Bowler.csはすでに記述済みです)。Window.csを書きましょう。窓にはstrengthがあります(Inspectorで10)。
- 当たるたびに、その衝撃速度の分だけ窓の強度が下がります。たとえば、2 m/sで当たると
strengthが2減ります。 strengthが0以下になると窓が割れます。窓を破壊しましょう。
Playを押し、弱いボールを数回転がしてから強いボールを転がし、Checkを押しましょう。
自分で試してみよう
using UnityEngine;
public class Window : MonoBehaviour
{
public float strength = 10f;
// 衝突するたびに、その衝突速度がstrengthから引かれ、0になると窓が割れる
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。