インパルスでジャンプ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 3/71。
AddForce は第2引数として ForceMode を受け取り、ベクトルをどのように適用するかを指定します。これを指定しない場合は ForceMode.Force になり、物理ステップ1回分続く押す力となるため、ステップごとに加え続ける必要があります。蹴る、ジャンプする、爆発するといった動作は一度に起こります。これが ForceMode.Impulse です。力全体を一度に加え、質量で割った力積の分だけ速度を変化させます。
このサッカーボール(0.5 kg)はクリックで蹴られます。次の物理ステップで速度が (0, 2, 6) / 0.5 = (0, 4, 12) m/s だけ変化し、その後は重力と芝生の影響を受けます。
void Update()
{
if (Input.GetMouseButtonDown(0))
{
rb.AddForce(new Vector3(0, 2, 6), ForceMode.Impulse);
}
}一度だけ加える力は、クリックしたフレームで Update() から呼び出せます。Unity はその力を保持し、次の物理ステップで適用します。4つのモードは、2つの点で異なります。一度に加えるかステップを通して加えるか、そして質量を考慮するかどうかです。
Force:ステップを通して加え、質量で割る(エンジン、風)。Acceleration:ステップを通して加え、質量は無視する。Impulse:一度に加え、質量で割る(キック、ジャンプ)。VelocityChange:一度に加え、質量は無視する。ベクトルが速度に直接加算される。
チャレンジ
簡単スペースキーを押すたびに、カエルが1回ジャンプするようにします。
- コメントの下に、
if (Input.GetKeyDown(KeyCode.Space))と書きます。 - その中で
rb.AddForce(Vector3.up * jumpImpulse, ForceMode.Impulse);を呼び出し、カエルの重さが2 kgとして扱われるようにします。
「プレイ」を押してスペースキーを押すと、カエルが跳ね上がって落ちてきます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class FrogJump : MonoBehaviour
{
public float jumpImpulse = 10f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
// Space: jumpImpulseによる上向きの加速を1回与える
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド