Menu
CoddyTech

AddForceで押す

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 2/71。

オブジェクトに Rigidbody が付くと、物理演算によって動くため、位置を変更するのではなく、力を加えるようになります。rb.AddForce(force)は、ニュートン単位の力であるVector3を使って剛体を押します。力は速度を設定するものではありません。力を加え続けるかぎり、力を質量で割った分だけ、毎秒剛体を加速させます。押すのをやめても、剛体はその時点の速度を保ちます。

このホバークラフト(2 kg)にはスラスターがあります。上矢印キーを押している間、thrustの力が+x方向ではなく、+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が各物理演算ステップの前に、1秒間に50回呼び出す処理です(理由はレッスン4で説明します)。この行にTime.deltaTimeがないのは、AddForceがすでにステップ全体に力を分配するためです。Time.deltaTimeを掛けると、押す力が50分の1になってしまいます。地面では摩擦が押し返すため、小さな力では重い箱がまったく動かないこともあります。

challenge icon

チャレンジ

簡単

力を使って、摩擦のないリンク上でパックを押して動かしましょう。

  1. FixedUpdate()内で、float h = Input.GetAxis("Horizontal");とfloat v = Input.GetAxis("Vertical");を読み取ります。
  2. Time.deltaTimeを使わずに、rb.AddForce(new Vector3(h, 0, v) * push);を呼び出します。

「プレイ」を押して、パックを押してから手を離します。パックは滑り続けます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class PuckPusher : MonoBehaviour
{
    public float push = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // パックを押す:Horizontal は x 軸方向、Vertical は z 軸方向
    }
}

物理演算とゲームプレイのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド