Rigidbodyを物理的に移動させる
3D空間でオブジェクトを物理的に移動させる場合、Transform
のposition
やlocalPosition
を直接変更するだけでは、
他のオブジェクトとの衝突や物理演算の影響を受けません。
物理的な移動を実現するためには、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を使用する
Rigidbody
のvelocity
を使うと、オブジェクトの速度を直接変更して移動させることができます。
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を使った移動
Rigidbody
のMovePosition
メソッドを使用すると、オブジェクトを移動させることができます。
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
を使った移動方法には、それぞれ特徴があります。
- AddForce を使って力を加える
Rigidbody.AddForce(Vector3 force, ForceMode mode)
- 物理演算の影響を受ける
- 加速度的な動きを表現するのに適している
- velocity を直接変更する
Rigidbody.velocity = new Vector3(x, y, z);
- 速度を即座に設定できる
- 一定速度で移動させるのに向いている
- MovePosition を使って移動させる
Rigidbody.MovePosition(targetPosition)
- Rigidbody の位置を補間しながら移動
- FixedUpdate で使うのが推奨される
Transform を使った移動との違い
Transform.position
を直接変更すると、物理エンジンの影響を受けずに瞬間的に位置を移動させることができます。
そのため、UI の移動やワープ処理には適していますが、衝突判定や物理挙動を伴うオブジェクトには向いていません。
物理オブジェクトと適切に連携させる場合は、Rigidbody を使った移動を選択するのがベストです。
それぞれの移動方法には特徴があるため、用途に応じて適切な方法を選ぶことが重要です。
例えば、リアルな動きを再現したい場合は AddForce、一定速度で動かしたい場合は velocity、補間移動したい場合は MovePositionというように、
状況に応じて使い分けましょう。