こんにちは、Unityエンジニアのオオバです。
UnityエディタでC#スクリプトを作成すると、デフォルトでUpdate関数が記述されています。このUpdateって何かというと毎フレームUnityから実行される関数です。例えばキャラクターを動かしたいときUpdateを使ったりします。
ちなみにUnityが提供する更新メソッドは3つあります。
- Update
- LateUpdate
- FixedUpdate
それぞれ役割と意味があり、 全くの別物 です。本記事では Update、LateUpdate、FixedUpdate3つの違い について徹底解説します。
正しく理解しておかないと、 描画周りや操作関連の不具合 を出してしまいます。
ぜひ本記事を通して学んでいきましょう。
Update・LateUpdate・FixedUpdateの違いは実行タイミング
はじめに結論を簡単にまとめます。
①Update・LateUpdate・FixedUpdateはイベント関数の1つ
②Updateはフレームの先頭で実行
③LateUpdateはすべてのUpdate終了後に実行
④FixedUpdateはデフォルト0.02秒ごとに実行
Update・LateUpdate・FixedUpdateはそれぞれ呼ばれるタイミングが違います。LateUpdateがUpdateより早く呼ばれることはありません。FixedUpdateは一定間隔で実行されます。
この特性をまずは頭に入れておきましょう。
ここを勘違いして 描画周りの不具合はよく発生 します。特に カメラを動かしたとき です。今回はよくあるトラブルを例にして Update・LateUpdate・FixedUpdateの違い を学んでいきましょう。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
Update・LateUpdate・FixedUpdateはイベント関数の1つ
Update・LateUpdate・FixedUpdateの具体的な内容に入る前に 必要な前提知識 を紹介させてください。
Update・LateUpdate・FixedUpdateは イベント関数の1つ です。
イベント関数とは MonoBehaviour
クラスを継承した際に使用可能になる特別なメソッドです。MonoBehaviourを継承、つまり自作コンポーネント内に記述したイベント関数はUnityから自動的に実行されます。
Update・LateUpdate・FixedUpdateはそれぞれ自動的にUnityから実行 されるのです。つまりMonoBehaviourを継承していないとそもそも実行されないので注意してください。
MonoBehaviour理解はのUnity開発の基礎の基礎です。もし理解に不安を感じている方はぜひこちらの記事を読んでみてください。
さきほどから登場する「コンポーネント」とはGameObjectに対して追加できる機能の事です。あなた自身が独自に作成して機能追加することが出来ます。GameObjectとコンポーネントの理解はUnity開発では必須ですので、参考記事をこちらで紹介しておきますね。
Update・LateUpdate・FixedUpdateの違いを正しく理解しよう
本章では「Update」「LateUpdate」「FixedUpdate」の基本を理解していきます。
基本を理解した後でUpdateにまつわる よくあるトラブルと回避方法 についても紹介していきます。
「Update」は毎フレーム実行する更新関数
Updateは毎フレームUnityから実行される更新関数です。フレームレートが30であれば、1÷30 = 0.0333...。約0.03秒に1回実行される関数です。フレームレートが60なら約0.16秒ごとに実行されます。
Updateは次のようなケースで使われます。
- アニメーション処理
- 毎フレーム実行したいロジック
アニメーションはその名の通りオブジェクトを動かします。毎フレーム実行したいロジックとは、例えばキャラクタの状態を毎フレームチェックして表示を更新したい場合に使用したりします。
3つのUpdateの中で最も使用頻度の高い関数です。
「LateUpdate」はUpdate後に実行する更新関数
LateUpdateはUpdate後に実行する関数です。
少しイメージがつきづらいかもしれません。更新中の処理の中で絶対最後に実行したい処理がある場合にLateUpdateを活用します。
例えば、ダメージ計算処理を全ておこなってから見た目に反映したい場合、Updateで「ダメージ計算処理」、LateUpdateで「見た目に反映」というふうに処理を分離させることで正常に動作させることも出来るでしょう。
UpdateとLateUpdateの活用方法については、後の章「Updateで起こったカメラに関するトラブルと解決方法」で紹介しているので参考にしてみてください。
LateUpdateはカメラ周りの処理を開発するときに登場しやすいです。
「FixedUpdate」は物理演算用の特殊な更新関数
最後にFixedUpdateです。3つのUpdateの中では特殊な関数で 0.02秒間隔で一定実行 します。何を処理させるかというと物理演算です。
具体的には RigidBody を扱う際にFixedUpdateを使用します。
RigidBodyについてはこちらの記事を参考にしてみてください。
例えばRigidBodyには AddForce
という力を加える関数があります。この関数はFixedUpdateで実装しなければいけません。
なぜならFixedUpdate実装しないと実行結果がUnityの実行環境ごとに変わってしまうからです。
どういうことかというと、仮に物理演算処理の AddForce
をUpdate関数で実装したとします。Updateの更新タイミングはPCとスマホではスペックが違うため実行間隔が変わります。すると物理演算の表示結果も大きく変わってしまいます。
だから常に一定間隔で実行する FixedUpdate を使わなければいけないということです。
AddForceについてはこちらの記事で詳しく解説しています。
UpdateとLateUpdateは一定間隔で実行されているわけではない
さきほどUpdateとLateUpdateは1フレームごとに実行すると説明しました。たしかに1フレームごとに実行はするのですが、実行間隔は一定ではありません。
どういうことかと言うと、1フレーム目と2フレーム目、2フレーム目と3フレーム目の間隔は必ずしも同じではないということです。
例えば、1フレーム目と2フレーム目の間隔が0.03秒だったとします。2フレーム目にCPU的に重い処理が実行されたとします。すると2フレーム目と3フレーム目の間は0.1秒かかることもあるということです。
この特性を知っておかないと等速でアニメーションさせたいけど実現できないという不具合が発生します。
等速で動かす場合はTime.deltaTimeを活用する
このフレーム間の秒数を取得するプロパティがUnityでは用意されています。それが 「Time.deltaTime」 です。
Time.deltaTime
を使うことで等速にアニメーションさせることが可能です。ではソースコードを見てみましょう。
💻ソースコード : 👎🏼間違った等速アニメーション処理
void Update()
{
transform.Translate(new Vector3(speed * 0.03f , 0, 0));
}
💻ソースコード : 👍正しい等速アニメーション処理
void Update()
{
transform.Translate(new Vector3(speed * Time.deltaTime, 0, 0));
}
このように移動させる距離に対して Time.deltaTime
を乗算することで途中重い処理が実行されても正常に等速アニメーションするようになります。
アニメーションを実装する際はしょっちゅう登場するプロパティなのでぜひ覚えておきましょう。
FixedUpdateは常に一定間隔で実行
FixedUpdateはUpdateやLateUpdateと違い、独立した形で常に一定間隔で実行します。
この一定間隔というのはProjectSettingsから変更可能です。
メニューEdit -> Project Settings -> Time
内 Fixed Timestep の値がFixedUpdateの間隔になります。
更新間隔を調整したい場合はProject Settingsから変更してみてください。
物理演算はFixedUpdateを使わなくても良くなった?
実はUnity2022.2から物理演算の更新関数が選択式になりました。
メニューEdit -> Project Settings -> Physics -> Settings
内の Simulation Mode のプルダウンから変更可能です。
デフォルトFixedUpdateに設定されていますが、Updateを選ぶこともできます。
UpdateとFixedUpdateで処理が分離され実装しづらかったのが解消されるかもしれません。
Updateで起こったカメラに関するトラブルと解決方法
カメラが何かを追いかける処理を 「Update」 だけで実装するのは要注意です。
わかりやすく説明するためにサンプルを作ってみました。
このようなUnityちゃんを等速で歩かせます。
ソースコードは次の通り。Unityちゃんを Update メソッドで移動させただけです。
using UnityEngine;
public class UnityChanWalk : MonoBehaviour
{
void Update ()
{
// Unity-chanが毎フレーム2cm移動する
transform.Translate(new Vector3(0.02f, 0));
}
}
次にUnityちゃんをカメラが追いかけるようにします。
このような感じで毎フレームUnityちゃんを追いかけます。
サンプルコードはこちらです。
💻ソースコード : Unityちゃんを追いかけるカメラのサンプル
using UnityEngine;
public class ChaseUnityChanCamera : MonoBehaviour
{
public Transform unityChan;
void Update ()
{
var pos = unityChan.position;
pos.y = 0.7f;
// Unity-chanの方をマイフレーム向くようにする
transform.LookAt(pos);
}
}
一見大丈夫そうに見えますが、実は とても危うい実装 なのです。
👉 ダウンロードしたUnityちゃんがピンク色!?修正して動かす方法【2025年版】
ちなみに何度か登場している「Transform」。 TransformとはUnityでは「移動」「回転」「拡大縮小」といった重要な機能を持った重要コンポーネント です。Unityで唯一GameObjectから削除できない特別なコンポーネントです。
Transformの理解はUnityでのゲーム開発には必須。Transformの理解に自信がない方はぜひこちらの記事を読んでみてください。
以降の章でなぜ危うい実装なのかを詳しく解説していきます。
オブジェクトとカメラを両方Updateで動かすことで起こる不具合
最初に大事なことをお伝えします。
「MonoBehaviour同士のUpdateの実行順は保証されません。」
つまりカメラとUnityちゃんのUpdateはどちらが先に実行されるか 保証がない のです。
どういう問題が発生するのか詳しく見ていきましょう。
本来、Unityちゃんが動いた後にカメラが追いかけるという処理にしたいはずです。
正常に動作するUpdateの処理順
【1フレーム目】👱♀️Unityちゃん → 📷カメラ
【2フレーム目】👱♀️Unityちゃん → 📷カメラ
【3フレーム目】👱♀️Unityちゃん → 📷カメラ
この処理順であれば正常に描画されます。
不具合の起きるUpdateの処理順
正常に処理していくれる順番でUpdateが実行してくれたら良いのですが、前述の通り Updateの順番は保証されない ため次のような順にもなりえます。
【1フレーム目】👱♀️Unityちゃん → 📷カメラ
【2フレーム目】📷カメラ → 👱♀️Unityちゃん・・・不具合
【3フレーム目】👱♀️Unityちゃん → 📷カメラ
↑上記のように2フレーム目に 📷カメラが先に動いてしまう とどうなるでしょうか。結論から言うとUnityちゃんの動きがカクカクします。
なぜUnityちゃんはカクカク動いてしまうのでしょうか。それはカメラが フレームジャンプ しているからです。
2フレーム目に 1フレーム目のUnityちゃん が表示され、3フレーム目には2フレームを スキップした形でUnityちゃんが表示 されてしまいます。
つまり3フレーム目の「Unityちゃん」は 瞬間移動 したように見えてしまい映像としてはカクついてしまうのです。
カメラがフレームジャンプする理由
カメラがフレームジャンプする理由を図解で表すとこんな感じです。
正常 | 不具合 |
---|---|
![]() | ![]() |
正常の方は一定間隔でUnityちゃんが移動していますが、不具合の方は2フレーム目が表示されておらず、一定間隔の移動になっていません。
具体的に各フレームで起きている状態を解説します。
【1フレーム目】
- 👱♀️Unityちゃん : 2cm進む
- 📷カメラ : 2cm進んだUnityちゃんを画面に映し出す
【2フレーム目】
- 📷カメラ : 2cm進んだUnityちゃんを画面に映し出す・・・不具合
- 👱♀️Unityちゃん : 4cm進む
【3フレーム目】
- 👱♀️Unityちゃん : 6cm進む
- 📷カメラ : 6cm進んだUnityちゃんを画面に映し出す
このように4cm進んだUnityちゃんをカメラは撮影できていないのです。これがフレームスキップの理由です。
この不具合を回避するために LateUpdate を利用します。
LateUpdateでカメラを処理する
先の描画トラブルはカメラが Unityちゃんより先に処理 されてしまったことが原因でした。つまり カメラが必ず後に処理 されれば問題ありません。
そこでLateUpdate内にカメラの処理を移動させます。
「LateUpdate」は 必ずUpdateの後に処理する更新メソッド です。Unityちゃんの処理はUpdateのままカメラが追いかける処理をLateUpdateに移すことで解決します。
解決したソースコードはこちらです。
💻ソースコード : LateUpdateでUnityちゃんを追いかけるカメラのサンプル
using UnityEngine;
public class ChaseUnityChanCamera : MonoBehaviour
{
public Transform unityChan;
// 「Update」から「LateUpdate」に変更
void LateUpdate ()
{
var pos = unityChan.position;
pos.y = 0.7f;
// Unity-chanの方をマイフレーム向くようにする
transform.LookAt(pos);
}
}
これで無事に想定通りの描画処理になりました。どうしてもカメラの処理をUpdateで書いてしまうと 先のフレームスキップの原因 になってしまいます。
カメラを動かす処理はLateUpdateで書きましょう。
Update・LateUpdate・FixedUpdateの違いまとめ
Update、LateUpdate、FixedUpdateの違いについて解説してきました。最後に記事の内容を簡単にまとめます。
①Update、LateUpdate、FixedUpdateは実行タイミングが違う
②LateUpdateは必ずUpdateの後に実行
③UpdateとLateUpdateは必ずしも一定間隔実行ではない
④FixedUpdateは必ず一定間隔で実行
⑤カメラを動かす処理はLateUpdateに書くのが吉
⑥最近のUnityではUpdateで物理演算も実行する設定もある
こんな感じです。
Update 、 LateUpdate 、 FixedUpdate は用途が全然違います。
UpdateとLateUpdateに関してはカメラ操作する際は顕著におかしくなるので要注意です。カメラ以外にも処理的に最後に回したいものも出てきます。そんなときに LateUpdate を使ってみてください。
また FixedUpdateとUpdateも使い分け にも注意してください。本来Updateに書くべき処理をFixedUpdateに書いてしまうと思わぬ不具合に遭遇します。ぜひともこの記事を何度も読んでもUpdate、LateUpdate、FixedUpdateの違いを正しく理解してから使用してみてください。
この記事があなたのゲーム開発に役に立ったらうれしいです。
Update、LateUpdate、FixedUpdateは重要な「イベント関数」です。Awakeも重要なイベント関数の1つです。ぜひUnityを扱う上でAwakeの特性もしっかり把握しておくことを強くオススメします。落とし穴が多い関数です。
↓↓詳しくはこちらの記事でわかりやすく紹介しています↓↓

筆者のXをフォローしよう
- Unity6000.0.32f1