1. はじめに
Unityでゲームを作るとき、多くの人が最初に出会うのが Update
と FixedUpdate
です。この2つのメソッドはどちらもスクリプトの中でよく使われますが、それぞれの役割を正しく理解しないと、思い通りにゲームが動かないことがあります。
例えば、「プレイヤーキャラクターがカクつく」「物理演算がうまく動かない」「キー入力の反応が遅れる」といった問題は、Update
と FixedUpdate
の使い方が間違っていることが原因かもしれません。
この記事では、
Update
とFixedUpdate
の違い- どんな処理をどちらに書くべきか
- 間違った使い方をするとどうなるのか
を詳しく解説します。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の特徴
- 一定の間隔で実行される
FixedUpdate
はフレームレートに関係なく、Unityの設定で決められた固定の時間間隔(デフォルトでは0.02秒ごと)で呼び出されます。そのため、フレームごとの変動がなく、安定した処理が可能です。 - 物理演算に適している
Rigidbody
を使ったオブジェクトの移動や重力の適用など、物理演算を行う処理はFixedUpdate
で実行するのが推奨されています。Update
で物理演算を行うと、フレームレートによって結果が変わる可能性がありますが、FixedUpdate
ならどの環境でも一貫した動作になります。 - フレームレートとは別に動作
FixedUpdate
は、ゲームのフレームレート(FPS)が変わっても、設定された間隔ごとに確実に実行されます。例えば、60FPSのゲームでは、Update
は1秒間に60回実行される可能性がありますが、FixedUpdate
は1秒間に**50回(0.02秒間隔)**実行されるというように、独立した動きをします。
FixedUpdateの使い方
物理演算を扱う場合、FixedUpdate
でRigidbody
の移動を処理します。例えば、以下のようなスクリプトでプレイヤーの移動を管理できます。
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でゲームを作るとき、Update
とFixedUpdate
はどちらもオブジェクトの動きを制御するためによく使われます。でも、この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の比較
Update
とFixedUpdate
の違いを表にまとめると、次のようになります。
項目 | Update | FixedUpdate |
---|---|---|
呼び出しタイミング | 毎フレーム | 一定時間ごと |
フレームレートの影響 | 受ける | 受けない |
適した処理 | ユーザー入力、アニメーション | 物理演算(Rigidbody) |
使うべき場面 | キーボードやマウスの入力、カメラの動き | オブジェクトの重力、衝突処理 |
まとめ
Update
は毎フレーム実行されるので、プレイヤーの操作やアニメーションの更新に向いているFixedUpdate
は一定の時間間隔で実行されるので、物理演算(Rigidbodyを使う処理)に最適Rigidbody
を使った移動をUpdate
で処理すると、フレームレートによって挙動が変わる可能性があるため注意が必要

この違いをしっかり理解して適切に使い分けることで、スムーズなゲームプレイを実現できます!
5. 具体的な使い分け
Unityでは、Update
とFixedUpdate
の使い分けがとても重要です。特に「どんな処理をどこに書けばいいの?」という疑問を持つ初心者も多いはず。ここでは、具体的な例を挙げながら、それぞれの適切な使い道を解説していきます。
① プレイヤーの移動を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);
}
このコードでは、Rigidbody
のvelocity
(速度)を直接変更して移動させています。こうすることで、フレームレートが変動しても、キャラクターの動きが安定します。
③ UpdateとFixedUpdateを組み合わせる
「じゃあ、入力処理も全部FixedUpdate
に書けばいいの?」と思うかもしれませんが、それはNGです。キー入力 (Input.GetAxis
や Input.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で物理演算を処理するとどうなる?
では、もしUpdate
でRigidbody
の処理を行うとどうなるでしょうか?
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の処理)に適しているUpdate
とFixedUpdate
を組み合わせて、キー入力をUpdate
、物理演算をFixedUpdate
で処理すると安定した動作になる- 間違った使い方をすると、移動が不安定になったり、キー入力が反応しなくなったりするので注意

この使い分けをしっかり理解して、スムーズなゲーム開発を進めましょう!
よくある質問(FAQ)
- Q
Update
とFixedUpdate
を同時に使ってもいいの? - A
はい、よく使われる組み合わせです。例えば、
Update
で入力を取得し、FixedUpdate
でRigidbody
を動かすことが多いです。
- Q
FixedUpdate
を頻繁に呼び出したい場合は? - A
Time.fixedDeltaTime
の値を小さく設定すればFixedUpdate
の呼び出し頻度を増やせますが、計算負荷が上がるので注意が必要です。
- Q
Update
で物理演算を行うとどうなる? - A
Rigidbody
の挙動がフレームレートに依存し、不安定になります。FixedUpdate
を使用しましょう。