Unity AnimatorのUpdate Mode|Normal・Fixed・UnscaledTimeの違いと使い分け
UnityのAnimatorは毎フレーム状態を進めて(Update して)アニメーションを再生します。このとき「どのループで・どの時間軸で更新するか」を決めるのがUpdate Modeです。設定を誤ると、ポーズ中もアニメが動き続けたり、物理オブジェクトがカクついたりします。逆に用途に合ったモードを選ぶだけで、これらは1行のコードで解消できます。本記事では AnimatorUpdateMode の3モード(Normal/Fixed/UnscaledTime)の違いと使い分け、旧 AnimatePhysics からの名称変更、Animator.Update() による手動更新までをサンプルコード付きで整理します。
まとめ:Update Modeの結論
- Normal:Updateループで更新。
Time.timeScaleに連動。通常のゲーム内アニメーションはこれ。 - Fixed(Unity 2022以前は AnimatePhysics):FixedUpdateループで更新。Rigidbodyなど物理と連動するキャラに使う。
- UnscaledTime:
Time.timeScaleを無視して実時間で更新。ポーズメニューやローディング演出などUI向け。 - スクリプトから自前のタイミングで1フレーム進めたいときは
Animator.Update(deltaTime)。ただし物理システムとは相性に注意。
Unity AnimatorのUpdate(更新)とUpdate Modeの関係
Animatorの「Update」とは、ステートマシンを1フレーム分進め、現在の姿勢を計算してTransformやBlendShapeに反映する処理を指します。この更新をエンジンのどのタイミングで走らせるかを制御するプロパティが Animator.updateMode(型は AnimatorUpdateMode)です。Inspectorの Animator コンポーネントにある「Update Mode」ドロップダウンと同じ設定で、スクリプトからも切り替えられます。
using UnityEngine;
public class AnimatorUpdateExample : MonoBehaviour
{
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
// 現在のUpdate Modeを確認する
Debug.Log(animator.updateMode);
}
}
ゲーム内で「アニメが遅く(速く)なる」「ポーズしても動く」「物理と噛み合わない」といった症状は、ほぼこのUpdate Modeの選択で説明できます。次章で3モードの違いを押さえます。
Update Modeの3種類と違い(Normal・Fixed・UnscaledTime)
Normal:Updateループで更新し、Time.timeScaleに連動
標準のモードです。毎フレームの Update フェーズで更新され、経過時間には Time.deltaTime(=Time.timeScale がかかった時間)を使います。Time.timeScale = 0 にするとアニメーションも停止し、スロー演出(timeScaleを下げる)にも追従します。キャラクターの移動・攻撃モーションなど、ゲーム進行と同じ時間軸で動かしたいアニメーションはこれを選びます。
Fixed:FixedUpdateループで更新し、物理と同期(旧AnimatePhysics)
FixedUpdateフェーズで更新するモードです。物理エンジンと同じ固定タイムステップで進むため、Rigidbodyを持つキャラクターや、アニメーションで動かした結果を当たり判定に反映したいオブジェクトで姿勢と物理がズレにくくなります。Unity 2022以前は AnimatePhysics という名称で、Unity 2023.1でenum値が Fixed に改称されました(挙動は同じ)。バージョンによる書き分けは後述します。
UnscaledTime:Time.timeScaleを無視して実時間で更新
Updateループで更新しますが、経過時間に Time.unscaledDeltaTime を使うため Time.timeScale の影響を受けません。Time.timeScale = 0 でゲームを止めても動き続けます。ポーズメニューのボタンアニメーション、ローディングスピナー、時間停止スキル中でも回したいUIなどに向きます。
| Update Mode | 更新ループ | Time.timeScale | 主な用途 |
|---|---|---|---|
| Normal | Update | 連動する | 通常のゲーム内アニメーション |
| Fixed(旧AnimatePhysics) | FixedUpdate | 連動する | Rigidbody・物理連動キャラ |
| UnscaledTime | Update | 無視する | ポーズUI・演出 |
Fixed(AnimatePhysics)による物理演算との同期
Rigidbodyで動くキャラクターをNormalのまま動かすと、アニメーション更新(Update)と物理更新(FixedUpdate)の頻度がフレームレートによってズレ、キャラの見た目と当たり判定が微妙にずれてカクついて見えることがあります。Update Modeを Fixed にすると、アニメーションが物理と同じFixedUpdateで進むため、この不整合を抑えられます。
// 物理演算と連動するキャラは Fixed(旧 AnimatePhysics)で更新する
animator.updateMode = AnimatorUpdateMode.Fixed;
選ぶ基準はシンプルです。Rigidbodyの動きにアニメーションを合わせたい、またはアニメーションでコライダーを動かして物理に効かせたいなら Fixed。逆に、物理と無関係なUIエフェクトや純粋な見た目のモーションにFixedを使うと、FixedUpdateの間隔でしか更新されず表示がカクつくため、その場合はNormalが適切です。物理を持たないオブジェクトにFixedを設定しても更新頻度が下がるだけで利点がないため、迷ったらNormalを既定にします。
Animator.Update()によるスクリプトからの手動更新
「unity animator update」で調べる意図には、Update Modeの設定だけでなく、Animator.Update(float deltaTime) でスクリプトから任意のタイミングでアニメーションを進める使い方も含まれます。リプレイやサーバー権威のゲームで再生時刻を自前管理する、生成直後に初期姿勢を1フレーム分だけ反映させる、といった場面で使います。
// 指定した時間だけアニメーションを進める(deltaTime秒ぶん評価)
animator.Update(Time.deltaTime);
// 0を渡すと現在パラメータでの姿勢を即時反映(初期化に便利)
animator.Update(0f);
公式リファレンスも注意しているとおり、Animator.Update() による手動更新は物理エンジンや通常のゲームループで評価される他システムとは噛み合わないことがあります。物理と連動させたいなら手動UpdateではなくUpdate ModeのFixedを使い、手動更新は「エンジンの自動更新を止めたうえで自分で時刻を管理する」用途に限定するのが安全です。
Update Modeの設定手順(Inspectorとスクリプト)
Inspectorでは、対象ゲームオブジェクトの Animator コンポーネント → Update Mode ドロップダウンから Normal/Fixed(またはAnimate Physics)/Unscaled Time を選ぶだけです。実行時に切り替えたい、あるいはプレハブ生成時に決めたい場合はスクリプトで updateMode に AnimatorUpdateMode の値を代入します。
animator = GetComponent<Animator>();
// ポーズ中も動かしたいUIアニメーション
animator.updateMode = AnimatorUpdateMode.UnscaledTime;
基本のセットアップ(AnimatorコンポーネントとAnimator Controller、Animation Clipの割り当て)が済んでいれば、Update Modeの変更はこの1プロパティだけで完結します。Controllerやクリップを差し替える必要はありません。
バージョンによる名称差とよくあるトラブルの切り分け
AnimatePhysicsからFixedへの名称変更(Unity 2023.1)
enum値の名称がバージョンで異なる点が、コード共有時のつまずきどころです。Unity 2022 LTS以前は AnimatorUpdateMode.AnimatePhysics、Unity 2023.1以降(Unity 6を含む)は AnimatorUpdateMode.Fixed です。両対応のコードにするなら、シンボルで分岐します。
#if UNITY_2023_1_OR_NEWER
animator.updateMode = AnimatorUpdateMode.Fixed;
#else
animator.updateMode = AnimatorUpdateMode.AnimatePhysics;
#endif
自分の使っているエディタが何を提供するかは、Unity 6を含むバージョンの変更点とあわせてUnityの日本語化とUnity 6の新機能|エディタ言語設定の手順と主な変更点で確認できます。
Time.timeScale=0でのアニメーション停止
NormalとFixedは Time.timeScale に連動するため、ポーズで timeScale = 0 にするとアニメーションも停止します。ポーズメニューやカットイン演出を止めたくない場合は、その対象のAnimatorだけ UnscaledTime にします。ゲーム全体はNormalのまま、UIのAnimatorのみUnscaledTimeにするのが定石です。
物理オブジェクトのカクつき・すり抜け
Rigidbodyキャラの見た目と当たり判定がズレる、高速移動ですり抜ける、といった症状はNormalで物理と更新タイミングが噛み合っていないサインです。Update Modeを Fixed に変えて物理と同じFixedUpdateで更新させると改善します。Unity-chanのような3Dモデルで動作を検証したい場合は、素材とライセンスをユニティちゃん(Unity-chan)とは?ダウンロード・ライセンス・ピンク色の直し方まで実践ガイドで確認したうえで試すと手早く再現できます。
よくある質問
unity animator updateとは何を指しますか?
広義には「AnimatorがステートマシンやBlend Treeを毎フレーム進めて姿勢を更新すること」です。実務では、その更新タイミングを決める Animator.updateMode(Update Mode)の設定と、スクリプトで手動評価する Animator.Update() メソッドの2つを指すことが多く、本記事はその両方を扱っています。
AnimatePhysicsとFixedは違うものですか?
同じ挙動で、名称が変わっただけです。Unity 2023.1で AnimatorUpdateMode.AnimatePhysics が AnimatorUpdateMode.Fixed に改称されました。どちらもFixedUpdateループで更新し、物理と同期します。
Update ModeをNormalにするとTime.timeScaleの影響を受けますか?
ドキュメント上の挙動としては受けます。NormalとFixedは Time.timeScale に連動し、スローやポーズ(timeScale = 0)でアニメーションも遅く・停止します。影響を受けたくないアニメーションは UnscaledTime を選びます。なお一部バージョンでNormalがtimeScaleの影響を受けないという報告もあるため、スロー・ポーズ時の挙動は使用中のUnityバージョンで実機確認しておくと確実です。
ポーズ中もアニメーションを動かすにはどうしますか?
動かしたいAnimatorの updateMode を AnimatorUpdateMode.UnscaledTime にします。これで Time.timeScale = 0 でも実時間で更新され続けるため、ポーズメニューやローディング演出が止まりません。
Animator.Update()はいつ使いますか?
リプレイやサーバー権威のゲームで再生時刻を自前管理する、生成直後に Update(0f) で初期姿勢を反映する、といった「エンジンの自動更新に任せず自分でタイミングを制御したい」場面で使います。物理と連動させたい用途では手動UpdateではなくUpdate ModeのFixedを使ってください。