【Unity】Rigidbodyを使うときは、FixedUpdate()を使いましょう

2024年9月13日

Unityで物理シミュレーションを使う際、Rigidbodyを使用することでオブジェクトに物理的な力や衝突の影響を適用できます。しかし、Rigidbodyを操作する際には、正しいタイミングで処理を行うことが重要です。本資料では、FixedUpdate()メソッドを使う理由とその正しい使い方について解説します。


物理演算とUpdateの違い

Unityのフレーム更新には2つの方法があります。

  • Update(): 通常のフレームごとの更新で、フレームレートに依存します。
  • FixedUpdate(): 物理演算に使われる更新タイミングで、フレームレートに依存せず一定間隔で呼び出されます。

物理演算(Rigidbodyを使った力の加算や移動)にはFixedUpdate()が使われるべきです。なぜなら、物理シミュレーションはFixedUpdate()のタイミングに合わせて処理されるためです。Update()を使うと、フレームレートの変動によって物理挙動が不安定になる可能性があります。


RigidbodyとFixedUpdate

Rigidbodyを使ってオブジェクトに力を加えたり、速度を調整する際は、FixedUpdate()内で操作することが推奨されます。以下のコード例を見てみましょう。


コード解説

  • FixedUpdate(): Rigidbodyに関連する処理を実行します。
  • Input.GetAxis(): プレイヤーの入力を取得し、移動量を決定します。
  • rb.AddForce(): Rigidbodyに力を加えて移動させます。これは自然な加速や減速を表現できます。

FixedUpdate()の使い方のポイント

  1. 物理演算はFixedUpdateで
  • 物理演算がフレームに依存しないため、移動や力の加算は必ずFixedUpdate()で行います。
  1. タイムステップの調整
  • Unityの物理演算はTime.fixedDeltaTimeによって制御されます。物理挙動が速すぎたり遅すぎたりする場合、この値を調整できますが、デフォルトの値(0.02秒)が推奨されています。
  1. Updateとの使い分け
  • プレイヤーの入力はUpdate()内で取得し、その結果をFixedUpdate()で物理演算に反映するのが一般的です。
void Update()
{
    // プレイヤーの入力処理はUpdateで行う
    moveHorizontal = Input.GetAxis("Horizontal");
    moveVertical = Input.GetAxis("Vertical");
}

void FixedUpdate()
{
    // 入力に基づいてRigidbodyの動きを処理
    Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
    rb.AddForce(movement * speed);
}

まとめ

Rigidbodyを使う際、物理演算はFixedUpdate()で行うのがベストプラクティスです。これにより、物理演算がフレームレートに依存せず、スムーズで正確な動作を実現できます。

物理演算が必要とされるときには、固定時間で処理されるFixedUpdate()にコードを記述しましょう

Unity,学習

Posted by hidepon