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になってしまいます。地面では摩擦が押し返すため、小さな力では重い箱がまったく動かないこともあります。
チャレンジ
簡単力を使って、摩擦のないリンク上でパックを押して動かしましょう。
FixedUpdate()内で、float h = Input.GetAxis("Horizontal");とfloat v = Input.GetAxis("Vertical");を読み取ります。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プレイグラウンド