この記事について

この記事では Rigidbody を使ってオブジェクトを物理挙動で移動させる方法を解説します。Unityでは座標を直接変更するのではなく、Rigidbodyを通して「速度」や「力」を与えるのが基本です。

この記事でわかること

  • Rigidbodyの移動方法の使い分け
  • MovePositionで座標移動
  • AddForce + ForceModeで力を加えて動かす

Rigidbodyとは?

Rigidbodyについては以下の記事を参考にしてください。

Rigidbodyの移動方法の使い分け表

方法特徴質量の影響向いている用途
MovePosition指定座標へ移動。補間は設定に従う。無関係移動床など、位置を制御する物体
AddForce (Force)継続的な力を加えて加速。自然な物理挙動。あり車の加速、風や重力の追加効果
AddForce (Impulse)一瞬の力を加える。瞬発的な動作。ありジャンプ、爆発、弾丸の衝撃
AddForce (VelocityChange)質量を無視して、現在の速度に変化量を加える。なしダッシュ、ノックバック
AddForce (Acceleration)質量を無視して一定の加速を与える。なしジェット推進、持続的な浮遊
Rigidbodyの概念図。MovePositionはキネマティック物体の位置を指定し、AddForceは非キネマティック物体の速度に変化を加える。ForceとImpulseは質量に依存し、ForceとAccelerationは時間刻みに依存する。
Rigidbodyの移動方法とForceModeの違いを示したオリジナル概念図。Unity 6.0公式仕様に基づく説明用で、実行画面・実測結果ではありません。Unityでの実行検証は行っていません。出典:Rigidbody.MovePosition、Rigidbody.AddForce。

Rigidbodyをスクリプトで制御

MovePosition(座標を指定して移動)

「MovePosition」はキネマティックなRigidbodyを指定したワールド座標へ移動させる方法です。移動床など、スクリプトで動かす物体に向いています。この例では同じGameObjectにスクリプトとRigidbodyを付け、Is Kinematicをオンにしてください。フレーム間の表示をなめらかにしたい場合はInterpolateも設定します。キネマティックなRigidbodyは衝突の力で押し戻されないため、壁に当たって自動で止まる動きには別途対応が必要です。

using UnityEngine;

public class Rigidbody_Move : MonoBehaviour
{
    private Rigidbody rb;

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

    void FixedUpdate()
    {
        // 右に移動(1秒で1.0)
        Vector3 target = transform.position + Vector3.right * Time.fixedDeltaTime;
        rb.MovePosition(target);
    }
}

AddForce(4種類のForceMode)

物理的な力を加えることで移動させる方法です。加え方はForceModeで切り替えられます。以下の4例は呼び出し部分の抜粋で、事前にRigidbodyを取得してrbに格納しておきます。試すときは先ほどのMovePositionを呼ぶ処理を止め、AddForceの例に切り替えてください。MovePositionの例とは設定が異なり、対象のGameObjectをアクティブにし、Is Kinematicをオフにしてください。ForceやAccelerationで力を加え続ける場合は、FixedUpdateから呼び出します。

ForceMode.Force

「ForceMode.Force」は継続的な力を与えて加速させるモードです。質量の影響を受けるため、車のアクセルや風の影響といった自然な物理挙動を再現するのに適しています。

rb.AddForce(Vector3.forward * 10f, ForceMode.Force);

ForceMode.Impulse

「ForceMode.Impulse」は一瞬だけの力を与えるモードで、ジャンプや爆発、弾丸の衝撃といった瞬発的な動作に使います。質量の影響を受けるため、重さによる挙動の違いも表現できます。

rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);

ForceMode.VelocityChange

「ForceMode.VelocityChange」は質量を無視して現在の速度に変化量を追加します。ダッシュやノックバックで、必要なタイミングに一度だけ速度を変えたい場合などに使います。下の例では右方向の速度を3加え、繰り返し呼ぶとそのたびに加算されます。位置の瞬間移動ではなく、質量に関係なく同じ速度の変化量が加わります。

rb.AddForce(Vector3.right * 3f, ForceMode.VelocityChange);

ForceMode.Acceleration

「ForceMode.Acceleration」は質量を無視して一定の加速度を加えるモードです。ロケットの推進や浮遊するオブジェクトなど、持続的に加速を与えたいケースで利用されます。

rb.AddForce(Vector3.up * 1f, ForceMode.Acceleration);

まとめ

  • MovePosition → キネマティックなRigidbodyを指定座標へ移動。補間は設定に従う
  • AddForce → 力を加えて物理的に自然な移動
  • ForceMode を切り替えることで「加速」「衝撃」「ダッシュ」など多彩に使える