Rigidbodyを物理的に移動させる

3D空間でオブジェクトを物理的に移動させる場合、TransformpositionlocalPositionを直接変更するだけでは、

他のオブジェクトとの衝突や物理演算の影響を受けません。

物理的な移動を実現するためには、Rigidbodyを利用し、以下のような方法で移動させることができます。

AddForceメソッドを使用する

以下の様なコンポーネントを用意しました。

public class AddForceTest : MonoBehaviour
{
    [SerializeField] private Rigidbody _rigidbody;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            _rigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);
        }
    }
}

スペースキーが押されると、AddForceメソッドで上方向の力を加えています。

第1引数には加える力を指定します。

第2引数には力の適用方法を指定し、ForceModeには以下の種類があります。

用途に応じて適切に使い分けましょう。

ForceMode物理的な特徴用途
ForceMode.Force質量の影響を受け、連続的に加速する風や推進力を与え続ける
ForceMode.Acceleration質量の影響を受けず、連続的に加速する重力や磁力など、オブジェクトの質量に関係なく加速する力
ForceMode.Impulse質量の影響を受け、一瞬の力で加速ジャンプや爆発の衝撃
ForceMode.VelocityChange質量の影響を受けず、一瞬で速度を変更ダッシュや瞬間的な移動

velocityを使用する

Rigidbodyvelocityを使うと、オブジェクトの速度を直接変更して移動させることができます。

Unity 6 系ではlinearVelocityに変更されています。

以下のようなコンポーネントを用意しました。

public class VelocityTest : MonoBehaviour
{
    [SerializeField] private Rigidbody _rigidbody;
    
    private void Update()
    {
        var moveX = Input.GetAxis("Horizontal");
        
        _rigidbody.linearVelocity = new Vector3(moveX * 5f, _rigidbody.linearVelocity.y, _rigidbody.linearVelocity.z);
    }
}

左右の入力に応じてlinearVelocityを変更し、オブジェクトを移動させています。

MovePositionを使った移動

RigidbodyMovePositionメソッドを使用すると、オブジェクトを移動させることができます。

MovePositionに現在の座標 + 移動量を渡すことで、その座標へスムーズに移動します。

以下のようなコンポーネントを用意しました。

public class MovePositionTest : MonoBehaviour
{
    [SerializeField] private Rigidbody _rigidbody;

    private Vector3 _movement;

    private void Update()
    {
        var moveX = Input.GetAxis("Horizontal");
        
        _movement = new Vector3(moveX * 5f, _rigidbody.position.y, _rigidbody.position.z);
    }

    private void FixedUpdate()
    {
        _rigidbody.MovePosition(_rigidbody.position + _movement * Time.fixedDeltaTime);
    }
}

左右の入力に応じて移動量を変更し、その値をMovePositionに渡すことでオブジェクトを移動させています。

入力はUpdate()で受け取り、物理演算と同期させるためFixedUpdate()で移動させます。

他のRigidbodyを持つオブジェクトに衝突すると押し出せます。

まとめ

Rigidbody を使った移動方法には、それぞれ特徴があります。

  1. AddForce を使って力を加える
    • Rigidbody.AddForce(Vector3 force, ForceMode mode)
    • 物理演算の影響を受ける
    • 加速度的な動きを表現するのに適している
  2. velocity を直接変更する
    • Rigidbody.velocity = new Vector3(x, y, z);
    • 速度を即座に設定できる
    • 一定速度で移動させるのに向いている
  3. MovePosition を使って移動させる
    • Rigidbody.MovePosition(targetPosition)
    • Rigidbody の位置を補間しながら移動
    • FixedUpdate で使うのが推奨される

Transform を使った移動との違い

Transform.positionを直接変更すると、物理エンジンの影響を受けずに瞬間的に位置を移動させることができます。

そのため、UI の移動やワープ処理には適していますが、衝突判定や物理挙動を伴うオブジェクトには向いていません。

物理オブジェクトと適切に連携させる場合は、Rigidbody を使った移動を選択するのがベストです。

それぞれの移動方法には特徴があるため、用途に応じて適切な方法を選ぶことが重要です。

例えば、リアルな動きを再現したい場合は AddForce一定速度で動かしたい場合は velocity補間移動したい場合は MovePositionというように、

状況に応じて使い分けましょう。

🗒️次の記事

🔗関連ページ