AddForceで押す
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 2/63。
オブジェクトにRigidbodyが付くと、物理演算によって動くようになるため、位置を変更するのではなく、力を加えるようにします。rb.AddForce(force)は、ニュートン単位の力であるVector3を使って剛体を押します。力を加えても速度が設定されるわけではありません。加え続けている間、毎秒、力を質量で割った分だけ剛体が加速します。押すのをやめても、剛体はそのときの速度を保ちます。
このホバークラフト(2 kg)にはスラスターがあります。上矢印キーを押している間、thrustの力で前方、+z方向に押します。スラスターの力が12なら、毎秒12 / 2 = 6 m/sずつ速度が増えます。
public float thrust = 12f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.UpArrow))
{
rb.AddForce(Vector3.forward * thrust);
}
}力を加える処理はFixedUpdate()に記述します。Unityは各物理演算ステップの前にこのメソッドを毎秒50回呼び出します(理由はレッスン4で説明します)。この行にはTime.deltaTimeを使いません。AddForceはすでに力をステップ全体に適用するため、Time.deltaTimeを掛けると、押す力が50分の1になってしまいます。地面では摩擦が逆向きに働くため、小さな力では重い箱がまったく動かないこともあります。
チャレンジ
簡単アイスリンク上のパックにはRigidbodyがあり、氷には摩擦がありません。矢印キーで押します。Horizontal軸はx方向に、Vertical軸はz方向に、pushの力(Inspectorで4)でパックを押します。
力だけで押すので、キーを離しても滑り続けます。Playを押し、リンク上でパックを操作してから、Checkを押します。
自分で試してみよう
using UnityEngine;
public class PuckPusher : MonoBehaviour
{
public float push = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// パックを押す: Horizontal は x 軸方向、Vertical は z 軸方向
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。