UnityUnityメモ

UnityのFixedUpdateとUpdateの違いを正しく理解する!使い分けのポイントを徹底解説

Unity

1. はじめに

Unityでゲームを作るとき、多くの人が最初に出会うのが UpdateFixedUpdate です。この2つのメソッドはどちらもスクリプトの中でよく使われますが、それぞれの役割を正しく理解しないと、思い通りにゲームが動かないことがあります。

例えば、「プレイヤーキャラクターがカクつく」「物理演算がうまく動かない」「キー入力の反応が遅れる」といった問題は、UpdateFixedUpdate の使い方が間違っていることが原因かもしれません。

この記事では、

  • UpdateFixedUpdate の違い
  • どんな処理をどちらに書くべきか
  • 間違った使い方をするとどうなるのか

を詳しく解説します。Unityのスクリプトをより理解して、スムーズに動作するゲームを作れるようになりましょう!



2. Updateとは?

Updateは、毎フレームごとに実行されるメソッドです。つまり、ゲームのフレームレート(FPS)が高ければUpdateが呼ばれる回数も増え、逆にフレームレートが低ければ呼ばれる回数も少なくなります。

Updateの基本的な動作

Unityでは、ゲームオブジェクトにアタッチしたスクリプトのUpdateメソッドが、毎フレーム自動的に実行されます。例えば、以下のコードを見てみましょう。

void Update() {
Debug.Log("Updateが実行されました!");
}

このスクリプトを実行すると、ゲームが動作している間は毎フレームごとに「Updateが実行されました!」というログが表示されます。例えば、ゲームのフレームレートが60FPSなら、1秒間に60回Updateが呼ばれることになります。

Updateが適している処理

Updateフレームレートに依存して実行されるため、以下のような処理に適しています。

プレイヤーの入力処理
→ キーボードやコントローラーのボタン入力を取得する

アニメーションの更新
Animatorコンポーネントを操作する処理

オブジェクトの座標更新
transform.positionを使って移動させる(物理演算を使わない場合)




Updateを使ったプレイヤー移動の例

たとえば、プレイヤーキャラクターを左右に移動させるスクリプトを考えてみましょう。

void Update() {
float move = Input.GetAxis("Horizontal") * 5f * Time.deltaTime;
transform.position += new Vector3(move, 0, 0);
}

このコードのポイント

  • Input.GetAxis("Horizontal")で、左右キー(A/Dや←/→)の入力を取得
  • 5fは移動速度
  • Time.deltaTimeを掛けて、フレームごとのズレを補正

Time.deltaTimeを使うことで、フレームレートが変化しても移動速度が一定になるように調整しています。


Updateを使う際の注意点

⚠️ 物理演算を含む処理はUpdateで行わない
Updateはフレームレートに依存するため、Rigidbodyを使った物理演算をここで行うと、フレームレートが変わるたびに動作が不安定になる可能性があります。

物理演算を使う場合はFixedUpdateを使用する


まとめ

  • Update毎フレームごとに呼び出されるメソッド
  • プレイヤーの入力処理やアニメーションの更新に適している
  • Time.deltaTimeを使ってフレームごとのズレを補正する
  • 物理演算はFixedUpdateで処理するべき



3. FixedUpdateとは?

FixedUpdateは、一定の時間間隔ごとに自動で実行されるメソッドです。Unityでは、物理演算(Rigidbodyを使った処理)を安定させるために用意されています。

FixedUpdateの特徴

  1. 一定の間隔で実行される
    FixedUpdateフレームレートに関係なく、Unityの設定で決められた固定の時間間隔(デフォルトでは0.02秒ごと)で呼び出されます。そのため、フレームごとの変動がなく、安定した処理が可能です。
  2. 物理演算に適している
    Rigidbodyを使ったオブジェクトの移動や重力の適用など、物理演算を行う処理はFixedUpdateで実行するのが推奨されています。Updateで物理演算を行うと、フレームレートによって結果が変わる可能性がありますが、FixedUpdateならどの環境でも一貫した動作になります。
  3. フレームレートとは別に動作
    FixedUpdateは、ゲームのフレームレート(FPS)が変わっても、設定された間隔ごとに確実に実行されます。例えば、60FPSのゲームでは、Updateは1秒間に60回実行される可能性がありますが、FixedUpdateは1秒間に**50回(0.02秒間隔)**実行されるというように、独立した動きをします。



FixedUpdateの使い方

物理演算を扱う場合、FixedUpdateRigidbodyの移動を処理します。例えば、以下のようなスクリプトでプレイヤーの移動を管理できます。

void FixedUpdate() {
float move = Input.GetAxis("Horizontal") * speed;
rb.velocity = new Vector3(move, rb.velocity.y, 0);
}

解説

  • Input.GetAxis("Horizontal")でプレイヤーの入力を取得
  • speedを掛けて速度を調整
  • rb.velocityを変更することで、Rigidbodyの物理特性を活かした移動が可能

FixedUpdateの呼び出し頻度を調整する

FixedUpdateの実行間隔は、Time.fixedDeltaTime で設定できます。例えば、デフォルトの0.02秒間隔を変更したい場合は、以下のように設定できます。

Time.fixedDeltaTime = 0.01f; // 0.01秒ごとにFixedUpdateを実行

注意点

  • fixedDeltaTimeを短くすると、より細かい物理演算が可能になるが、CPU負荷が増加する
  • 不要に小さくするとパフォーマンスが低下するため、適切なバランスが必要

まとめ

FixedUpdate一定間隔ごとに実行されるメソッド
✅ 物理演算(Rigidbodyの操作など)に適している
✅ フレームレートに影響されないため、安定した物理挙動を実現できる
Time.fixedDeltaTimeを調整すれば、呼び出し頻度を変えることも可能

このように、FixedUpdateは物理演算を安定して処理するために欠かせない機能です。次は、Updateとの具体的な違いを詳しく見ていきましょう!




4. UpdateとFixedUpdateの違い

Unityでゲームを作るとき、UpdateFixedUpdateはどちらもオブジェクトの動きを制御するためによく使われます。でも、この2つには重要な違いがあり、適切に使い分けないと意図しない挙動になることがあります。ここでは、それぞれの違いを詳しく解説します。


Updateとは?

Updateは、毎フレームごとに呼び出されるメソッドです。Unityのフレームレートに依存しており、例えば60FPS(1秒間に60フレーム)なら、1秒間に60回Updateが実行されます。逆に、フレームレートが30FPSなら1秒間に30回しか実行されません。

Updateの特徴:

  • 毎フレーム実行される
  • フレームレートによって実行回数が変わる
  • ユーザー入力やアニメーションの更新に向いている

Updateの具体的な使い方として、キーボードの入力を受け取る処理が挙げられます。

void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
Debug.Log("スペースキーが押されました!");
}
}

このように、Updateはキー入力のようなリアルタイム処理に最適です。フレームごとに更新されるので、プレイヤーの操作をスムーズに受け取ることができます。




FixedUpdateとは?

FixedUpdateは、一定の時間間隔で呼び出されるメソッドです。デフォルトでは0.02秒ごと(1秒間に50回)に実行されるため、フレームレートに依存しません。
特に**物理演算(Rigidbodyを使った移動や衝突判定)**に適しています。

FixedUpdateの特徴:

  • 一定の間隔で実行される(デフォルトは1秒間に50回)
  • フレームレートの影響を受けない
  • **物理演算(Rigidbodyの移動や衝突処理)**に向いている

例えば、Rigidbodyを使ってオブジェクトを移動させる場合、FixedUpdateを使うのが適切です。

void FixedUpdate() {
float move = Input.GetAxis("Horizontal");
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(move * 5f, rb.velocity.y, 0);
}

このコードでは、FixedUpdate内でRigidbodyの速度を変更しています。物理演算の処理は**FixedUpdateで行うのが基本**です。


UpdateとFixedUpdateの比較

UpdateFixedUpdateの違いを表にまとめると、次のようになります。

項目UpdateFixedUpdate
呼び出しタイミング毎フレーム一定時間ごと
フレームレートの影響受ける受けない
適した処理ユーザー入力、アニメーション物理演算(Rigidbody)
使うべき場面キーボードやマウスの入力、カメラの動きオブジェクトの重力、衝突処理

まとめ

  • Updateは毎フレーム実行されるので、プレイヤーの操作やアニメーションの更新に向いている
  • FixedUpdateは一定の時間間隔で実行されるので、物理演算(Rigidbodyを使う処理)に最適
  • Rigidbodyを使った移動をUpdateで処理すると、フレームレートによって挙動が変わる可能性があるため注意が必要

この違いをしっかり理解して適切に使い分けることで、スムーズなゲームプレイを実現できます!




5. 具体的な使い分け

Unityでは、UpdateFixedUpdateの使い分けがとても重要です。特に「どんな処理をどこに書けばいいの?」という疑問を持つ初心者も多いはず。ここでは、具体的な例を挙げながら、それぞれの適切な使い道を解説していきます。


① プレイヤーの移動をUpdateで処理する場合

もしプレイヤーの移動をUpdate内で処理する場合、transform.positionを直接変更することになります。この方法は、シンプルで扱いやすいですが、フレームレートの影響を受けやすいのが欠点です。

例えば、以下のコードを見てみましょう。

void Update() {
float move = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
transform.position += new Vector3(move, 0, 0);
}

このコードでは、キー入力 (Input.GetAxis("Horizontal")) に応じて、オブジェクトを移動させています。ただし、Updateはフレームレートに依存するため、低フレームレートの環境では動きがカクカクになったり、処理落ちによって移動速度が変わってしまう可能性があります。


② 物理演算をFixedUpdateで処理する場合

Unityでは、Rigidbodyを使った物理演算はFixedUpdateで処理するのが基本です。Updateで物理演算を行うと、フレームレートの影響で不安定な挙動になってしまいます。

そこで、FixedUpdateを使うと、一定の時間間隔で処理が行われるため、安定した動きが実現できます。以下のコードを見てみましょう。

void FixedUpdate() {
float move = Input.GetAxis("Horizontal") * speed;
rb.velocity = new Vector3(move, rb.velocity.y, 0);
}

このコードでは、Rigidbodyvelocity(速度)を直接変更して移動させています。こうすることで、フレームレートが変動しても、キャラクターの動きが安定します。


③ UpdateとFixedUpdateを組み合わせる

「じゃあ、入力処理も全部FixedUpdateに書けばいいの?」と思うかもしれませんが、それはNGです。キー入力 (Input.GetAxisInput.GetKey) はUpdateで取得するのがベストです。

なぜなら、FixedUpdateは毎フレーム呼ばれるわけではないため、入力を見逃してしまう可能性があるからです。例えば、FixedUpdateの実行タイミングの間にキーが押されていた場合、その入力が反映されないことがあります。

なので、基本的な書き方としては、

  • 入力処理 (Input.GetAxis など) は Update に書く
  • 物理演算 (Rigidbody への影響) は FixedUpdate に書く

というのがベストな方法です。

例えば、以下のように書くと、安定した動作になります。

float moveInput;

void Update() {
moveInput = Input.GetAxis("Horizontal");
}

void FixedUpdate() {
rb.velocity = new Vector3(moveInput * speed, rb.velocity.y, 0);
}

こうすることで、キー入力を適切に取得しつつ、FixedUpdateで安定した物理演算を行うことができます。




④ Updateで物理演算を処理するとどうなる?

では、もしUpdateRigidbodyの処理を行うとどうなるでしょうか?

void Update() {
rb.velocity = new Vector3(Input.GetAxis("Horizontal") * speed, rb.velocity.y, 0);
}

このように書くと、フレームレートが高い時と低い時でオブジェクトの速度が変わってしまい、不安定な動きになってしまいます。特に60FPSの環境と30FPSの環境では、移動速度が2倍の差になることもあります。

物理演算は**FixedUpdateで行う!**
これはUnityの基本ルールなので、覚えておきましょう。


⑤ FixedUpdateで入力処理をするとどうなる?

逆に、FixedUpdateでキー入力を取得しようとすると、以下のような問題が発生します。

void FixedUpdate() {
if (Input.GetKeyDown(KeyCode.Space)) {
Debug.Log("ジャンプ!");
}
}

この場合、FixedUpdateが呼ばれるタイミングとキー入力のタイミングがズレると、ジャンプ入力を見逃してしまうことがあります。

特に、FixedUpdateのデフォルトの間隔 (Time.fixedDeltaTime = 0.02秒) では、1秒間に50回しか呼ばれません。一方で、Updateは60FPSなら1秒間に60回呼ばれるため、キー入力を逃す可能性が高くなります。

したがって、 ✅ キー入力はUpdateで取得する
物理演算はFixedUpdateで処理する

というルールを守るのがポイントです。


まとめ

  • Updateはフレームごとに実行されるので、入力処理やアニメーションに適している
  • FixedUpdateは一定時間ごとに実行されるので、物理演算(Rigidbodyの処理)に適している
  • UpdateFixedUpdateを組み合わせて、キー入力をUpdate、物理演算をFixedUpdateで処理すると安定した動作になる
  • 間違った使い方をすると、移動が不安定になったり、キー入力が反応しなくなったりするので注意

この使い分けをしっかり理解して、スムーズなゲーム開発を進めましょう!




よくある質問(FAQ)

Q
UpdateFixedUpdateを同時に使ってもいいの?
A

はい、よく使われる組み合わせです。例えば、Updateで入力を取得し、FixedUpdateRigidbodyを動かすことが多いです。

Q
FixedUpdateを頻繁に呼び出したい場合は?
A

Time.fixedDeltaTimeの値を小さく設定すればFixedUpdateの呼び出し頻度を増やせますが、計算負荷が上がるので注意が必要です。

Q
Updateで物理演算を行うとどうなる?
A

Rigidbodyの挙動がフレームレートに依存し、不安定になります。FixedUpdateを使用しましょう。

タイトルとURLをコピーしました