UnityのAnimatorは、毎フレームのUpdate(更新)でステートマシンを進めて姿勢を計算します。その更新を「どのループで・どの時間軸で」走らせるかを決めるのがUpdate Modeです。ポーズ中もアニメが動き続ける場合や、Rigidbodyのキャラで更新タイミングがずれる場合は、まずこの設定を確認します。
注意したいのは、Unity 2023.1で仕組みが変わった点です。以前の AnimatePhysics は、更新タイミングの「Fixed」と、Inspectorの「Animate Physics」チェックボックスの2つに分かれました。本記事では3モードの違いと使い分け、この分離の意味、Animator.Update() による手動更新までを、Unity 6(6000.x)のソースと公式リファレンスに沿って整理します。
まとめ:Update Modeの選び方
- Normal:Updateループで更新し、
Time.timeScaleに連動。通常のキャラクターや演出はこれ。 - Fixed:FixedUpdateループで更新。Rigidbodyと動きを揃えたいキャラに使う(Unity 2022以前の名称は
AnimatePhysics)。 - UnscaledTime:
Time.timeScaleを無視して実時間で更新。ポーズメニューやローディング演出向け。 - Unity 2023.1以降、アニメーションで動かすキネマティックRigidbodyで他の物体を押す・乗せるには、Fixedとは別にAnimate Physics(
Animator.animatePhysics)をオンにする。 - 自分のタイミングで進めたいときは
Animator.Update(deltaTime)。ただし並列評価されず、物理とも噛み合わないことがある。
Animatorの更新(Update)とUpdate Modeの関係
Animatorの「Update」は、ステートマシンとBlend Treeを1フレーム分進め、計算した姿勢をTransformなどへ書き込む処理です。公式リファレンスのAnimatorクラスは、既定では Time.deltaTime に従って毎フレーム評価すると説明し、その挙動を変える手段として Animator.updateMode・Animator.cullingMode・Animator.Update の3つを挙げています。
このうち updateMode(型は AnimatorUpdateMode)が、Inspectorの「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種類と違い(Normal・Fixed・UnscaledTime)
enumの値は Normal = 0、Fixed = 1、UnscaledTime = 2 の3つです。AnimatorUpdateModeのリファレンスの説明を、更新ループと時間軸で並べると次のとおりです。
| Update Mode | 更新ループ | Time.timeScale | 向く用途 |
|---|---|---|---|
| Normal | Update | 連動する | 通常のキャラ・演出 |
| Fixed(旧AnimatePhysics) | FixedUpdate | 連動する | Rigidbody連動のキャラ |
| UnscaledTime | Update | 無視する | ポーズUI・ローディング |
Normal:Updateループで更新しTime.timeScaleに連動
Animatorクラスの説明にある「既定では Time.deltaTime に従って毎フレーム評価する」動作がこのモードです。Updateフェーズで更新し、Time.timeScale を下げればアニメも遅くなり、0にすれば止まります。リファレンスは「物理と独立して動くアニメーション向け」としています。キャラクターの移動・攻撃モーションなど、ゲーム進行と同じ時間で動かすものはNormalのままで構いません。
Fixed:FixedUpdateループでの更新と物理との同期
物理エンジンと同じ固定タイムステップ(Time.fixedDeltaTime)で評価します。fixedDeltaTimeのリファレンスのとおりこの間隔はゲーム内時間なので、Time.timeScale を0.5にすると実時間では2倍の間隔になり、Fixedのアニメも同じだけ遅くなります。Rigidbodyで動くキャラクターの姿勢と当たり判定がずれにくくなる一方、描画フレームより更新が粗くなることがあります。物理と関係のないUIや装飾にFixedを使うと見た目だけがカクつくので、避けてください。
UnscaledTime:Time.timeScaleを無視して実時間で更新
Updateループで更新しますが、時間のスケーリングを受けません。Time.timeScale = 0 でゲームを止めても動き続けるため、リファレンスも「ゲームを一時停止しても動かしておきたいUIやエフェクト向け」と書いています。
Animatorコンポーネントの設定項目(Inspector)
Animatorを使うには、GameObjectにAnimatorコンポーネントを追加し、どのクリップをどう遷移させるかを定義したAnimator Controllerを割り当てます。Unity 6のInspectorに並ぶ項目は、AnimatorInspector.cs(UnityCsReference 6000.0)で確認すると次の順です。
| 項目 | スクリプトのプロパティ | 役割 |
|---|---|---|
| Controller | runtimeAnimatorController | 使うAnimator Controller |
| Avatar | avatar | Humanoidのリターゲット用 |
| Apply Root Motion | applyRootMotion | 移動をアニメ側で制御するか |
| Animate Physics | animatePhysics | アニメの移動を物理へ通知 |
| Update Mode | updateMode | 更新ループと時間軸 |
| Culling Mode | cullingMode | 画面外での更新範囲 |
Animate Physicsの行はUnity 2023.1で増えた項目で、2022.3のInspectorにはありません。一方でAnimatorコンポーネントのマニュアルは、6000.7や7000.0の版でもUpdate Modeの選択肢を「Normal/Animate Physics/Unscaled Time」と旧名で載せ、Animate Physicsのチェックボックスに触れていません。このUpdate Modeの表記差は、使用中のUnityバージョンに対応するスクリプトリファレンスとInspector実装を照合して判断してください。
FixedとAnimate Physicsチェックボックスの関係(Unity 2023.1以降)
Unity 2022.3までのAnimatePhysics:更新タイミングと物理連携の一体化
Unity 2022.3までの AnimatorUpdateMode は Normal・AnimatePhysics・UnscaledTime でした。同じ版の Animator.animatePhysics は非推奨のboolで、ソース上は updateMode == AnimatorUpdateMode.AnimatePhysics を返すだけの別名です。つまりUpdate ModeをAnimate Physicsにすれば、FixedUpdateで評価することと物理へ動きを伝えることが一度に有効になりました。
Unity 2023.1以降のFixed:更新タイミングだけを担い、物理への通知は別スイッチ
2023.1で enum値は Fixed に置き換わり、AnimatePhysics には次のObsolete属性が付きました。UnityCsReferenceの2023.1ブランチから7000.0ブランチまで、2023.2・6000.0・6000.3・6000.5・6000.7の各ブランチでも同じ文言です(2026年10月28日確認)。
[Obsolete("Enum member AnimatorUpdateMode.AnimatePhysics has been deprecated. Use AnimatorUpdateMode.Fixed to evaluate in FixedUpdate time and Animator.animatePhysics to sync transforms for physics. (UnityUpgradable) -> Fixed", true)]
AnimatePhysics = 1
「FixedUpdateで評価するならFixed、Transformを物理に同期するならanimatePhysics」という指示で、役割が2つに分かれたことを示しています。animatePhysics は独立したプロパティになり、リファレンスでは「有効にすると、キネマティックRigidbodyを持つGameObjectのアニメーション後のTransformを物理システムが使い、他のGameObjectに影響させる」と説明されています。例として挙がっているのが、アニメーションで動く床に乗った物体へ速度と摩擦を伝えるケースで、床側のRigidbodyは Is Kinematic をオンにしておく必要があります。
using UnityEngine;
// アニメーションで往復する床。上に乗ったRigidbodyを一緒に運ぶ
[RequireComponent(typeof(Animator), typeof(Rigidbody))]
public class MovingPlatform : MonoBehaviour
{
void Awake()
{
var body = GetComponent<Rigidbody>();
body.isKinematic = true; // 床はキネマティック
var animator = GetComponent<Animator>();
animator.updateMode = AnimatorUpdateMode.Fixed; // 物理と同じFixedUpdateで評価
animator.animatePhysics = true; // 動きを物理システムへ通知
}
}
上のMovingPlatformは更新設定だけの例です。床にはColliderと、床を移動させるAnimation Clipを含むAnimator Controllerが別途必要です。判断の目安は次の2つです。Rigidbodyで動くキャラのアニメーション評価をFixedUpdateに揃える目的ならFixedを選びます。アニメーションで動かすコライダーで他の物体を押す・運ぶなら、Fixedに加えてAnimate Physicsもオンにします。
同じコードで意味が変わる animatePhysics の罠
animator.animatePhysics = true; という1行は、2022.3では「Update ModeをAnimatePhysicsにする」意味でしたが、2023.1以降は「物理への通知をオンにする」だけでUpdate Modeは変わりません。2022時代のコードをUnity 6へ持ち込んだら、Update Modeが意図どおりFixedになっているかを確かめてください。
また AnimatePhysics のObsolete属性は第2引数が true のため、2023.1以降に書くとコンパイルエラーになります。(UnityUpgradable) -> Fixed の指定によりAPI Updaterが Fixed へ書き換えますが、上で見たとおり、書き換え後は物理への通知が含まれない点に注意が必要です。複数バージョンで共有するコードなら、シンボルで分けます。
#if UNITY_2023_1_OR_NEWER
animator.updateMode = AnimatorUpdateMode.Fixed;
animator.animatePhysics = true; // 物理へ動きを伝える場合のみ
#else
animator.updateMode = AnimatorUpdateMode.AnimatePhysics;
#endif
Unity 6系のどの版を使うかは、Unity 6.3 LTS(6000.3)の新機能と変更点|最新パッチ・サポート期限・6.0からの移行でサポート期限とあわせて確認できます。
ポーズ中のUI:スクリプトによるUpdate Modeの切り替え
Update Modeは実行中にも変えられます。ここでは、ポーズ中だけUIのAnimatorをUnscaledTimeにする例を示します。menuAnimatorにはInspectorで対象を割り当ててください。この例は通常時のtimeScaleを1としており、スローモーション中の値を復元する場合はポーズ前の値を保存する必要があります。公式リファレンスのサンプルも、ポーズ時にUnscaledTimeへ切り替え、再開時にNormalへ戻す構成になっています。
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
[SerializeField] private Animator menuAnimator; // ポーズメニューのAnimator
public void SetPaused(bool paused)
{
// ゲーム全体はtimeScaleで止め、メニューだけ実時間で動かす
Time.timeScale = paused ? 0f : 1f;
menuAnimator.updateMode = paused
? AnimatorUpdateMode.UnscaledTime
: AnimatorUpdateMode.Normal;
}
}
ポーズメニューのように常に実時間で動けばよいAnimatorは、切り替えずにInspectorで最初からUnscaled Timeにしておく方が単純です。切り替えが要るのは、平常時はスローモーションに追従させたいが、ポーズ中だけは動かしたいAnimatorです。
Animator.Update()による手動更新と実行上の制約
Animator.Update(float deltaTime) は、渡した時間だけAnimatorを即座に評価するメソッドです。Animatorクラスの説明では、この呼び出しはUpdate Modeとは無関係に動きます。リプレイやネットワーク同期のように再生時刻を自前で管理したい場合は、Animatorを無効にしてエンジンの自動更新を止め、自分で進めます。
using UnityEngine;
public class ManualAnimatorTick : MonoBehaviour
{
[SerializeField] private Animator animator;
[SerializeField] private float tickRate = 30f; // 1秒あたりの評価回数
private float accumulated;
void Start()
{
if (tickRate <= 0f)
{
Debug.LogError("tickRateは0より大きい値にしてください");
enabled = false; // 不正な値ではこのスクリプトを止める
return;
}
animator.enabled = false; // 自動更新を止める
}
void Update()
{
accumulated += Time.deltaTime;
float step = 1f / tickRate;
while (accumulated >= step)
{
animator.Update(step); // 固定刻みで手動評価
accumulated -= step;
}
}
}
使う前に知っておきたい制約が2つあります。
- 並列評価されない:Animatorクラスの説明によると、Mecanimは通常Animatorを複数のCPUコアに分けて評価しますが、
Animator.Updateで手動評価したものは並列実行の対象外です。数十体を手動で回すなら、複数のAnimatorをPlayableGraphにまとめてグラフ側を手動更新する方法が勧められています。 - 物理とずれることがある:Update(float)のリファレンスは、このメソッドでの更新は物理エンジンやゲームループで評価される他のシステムとうまく噛み合わない場合があると注意しています。物理と揃えたいだけなら手動更新ではなくFixedを選びます。
Photon Fusionのようにティック単位で状態を進めるネットワークエンジンでは、アニメーションの進め方も同期方式に合わせる必要があります。モードごとの違いはPhoton Fusionとは?Fusion 2.1の3モードの違い・料金試算・PUN2からの移行【2026年10月】で整理しています。
よくあるトラブルの切り分け
ポーズ(Time.timeScale = 0)中のアニメーション停止と対処
NormalとFixedは時間のスケーリングを受けるため、timeScale = 0 で止まるのは仕様どおりです。止めたくないAnimatorだけをUnscaledTimeにします。ゲーム全体をUnscaledTimeにするとスロー演出にも追従しなくなるので、対象はUIや演出用のAnimatorに絞ります。
Rigidbodyキャラのカクつきと移動床の追従不良への対処
キャラの見た目と当たり判定がずれてカクつくなら、Update ModeをFixedにしてFixedUpdateで評価させます。アニメーションで動く床やエレベーターの上の物体が滑り落ちる、押されないといった症状は、Fixedだけでは直りません。Unity 2023.1以降なら床のAnimatorでAnimate Physicsをオンにし、床のRigidbodyをキネマティックにしてください。
画面外のアニメーション停止とCulling Modeの確認
これはUpdate ModeではなくCulling Modeの影響です。AnimatorCullingModeは、Always Animate(画面外でも常に更新)、Cull Update Transforms(描画されていない間はリターゲット・IK・Transformの書き込みを止める)、Cull Completely(完全に止める)の3つです。画面外でもイベントや位置を進めたいキャラはAlways Animateにします。大量のキャラを置く場面では、画面外で状態更新を止めても支障のないキャラにCull Completelyを設定すると、Rendererが非表示の間のアニメーション更新を省けます。
Unity-chanのようなHumanoidモデルで挙動を試す場合は、素材のライセンスをユニティちゃん(Unity-chan)とは?ダウンロード・ピンク色の直し方・ライセンスをUnity 6対応で解説で確認してから使うと安心です。Unity 6でエディタの表示言語を切り替えたいときはUnityを日本語化する方法(Unity 6対応)とUnity 6の新機能・変更点が参考になります。アニメーションを多用するゲームやシミュレーションを社外に依頼したい場合は、issohのゲームアプリ開発でも相談を受け付けています。
よくある質問
unity animator updateとは何を指しますか?
AnimatorがステートマシンとBlend Treeを進めて姿勢を更新する処理のことです。実務では、そのタイミングを決める Animator.updateMode(Update Mode)と、スクリプトから手動で評価する Animator.Update() のどちらかを指すことがほとんどです。
AnimatePhysicsとFixedは同じものですか?
更新タイミングは同じFixedUpdateですが、完全に同じではありません。Unity 2023.1以降、物理システムへアニメーションの動きを伝える役割は Animator.animatePhysics(InspectorのAnimate Physics)に分かれました。旧AnimatePhysicsで動く床に物体を乗せていた場合は、FixedとAnimate Physicsの両方を設定します。
Update ModeをNormalにするとTime.timeScaleの影響を受けますか?
受けます。timeScaleを下げればアニメもスローになり、0で停止します。影響を受けたくないAnimatorはUnscaledTimeにします。
ポーズ中もアニメーションを動かすにはどうしますか?
そのAnimatorの updateMode を AnimatorUpdateMode.UnscaledTime にします。Time.timeScale = 0 でも実時間で更新されます。
Animator.Update()はいつ使いますか?
リプレイやネットワーク同期など、再生時刻を自分で管理したいときです。animator.enabled = false で自動更新を止めてから呼びます。手動評価は並列実行されないため、多数のAnimatorを手動で回すならPlayableGraphにまとめる方法を検討します。