【Unity】Unity Animator Controller入門:アニメーション状態を自在に制御する

作成: 2026-02-05最終更新: 2026-07-13

UnityのAnimator Controllerでキャラクターアニメーションを管理する方法を解説。State Machine、Transition、Parameters、Blend Treeの使い方を詳しく紹介します。

動作確認環境: Unity 2022.3 LTS / Unity 6

歩き・走り・ジャンプ・攻撃——アニメーションクリップは用意できたのに、いざ「状況に応じて切り替える」となると、どこから手を付ければいいのか分からない。キャラクターを動かし始めた誰もが、最初にぶつかる壁です。

Animator Controller(アニメーターコントローラー) は、Unity公式のアニメーション管理システムです。複数のアニメーションクリップを視覚的に管理し、State Machine(ステートマシン)を使って「いつ・どのアニメーションを再生するか」を矢印でつないで設計できます。

Animator Controllerのイメージ。待機・走り・ジャンプの3つの状態カードが円環の矢印で結ばれたステートマシンの図

この記事でわかること

  • Animator Controllerの作成と割り当て(Apply Root Motionの落とし穴含む)
  • State Machine——Entry・Any State・Exitと状態遷移の基本
  • Parameters(Float/Int/Bool/Trigger)とスクリプトからの制御
  • Blend Tree で歩き⇔走りを滑らかに切り替える
  • Animation Layers で「歩きながら撃つ」を上半身だけ重ねる
  • ジャンプ・攻撃・連続攻撃の実践的なTransition設定

Sponsored

Animator Controllerの作成方法

方法1:手動で作成

  1. Projectウィンドウで右クリック
  2. 「Create」→「Animator Controller」を選択
  3. ファイル名を設定(例:「PlayerAnimator」)

方法2:自動作成

Animation Windowでゲームオブジェクトをアニメーション化すると、Animator Controllerが自動的に作成されます。

ゲームオブジェクトに割り当てる

  1. ゲームオブジェクトを選択
  2. インスペクターで「Add Component」→「Animator」を選択
  3. AnimatorコンポーネントのControllerフィールドに、作成したAnimator Controllerをドラッグ&ドロップ

Apply Root Motionについて

Animatorコンポーネントには「Apply Root Motion」というチェックボックスがあります。

設定動作
オンアニメーションに含まれる移動・回転がキャラクターに適用される
オフアニメーションの移動・回転は無視され、スクリプトで制御する
Apply Root Motionのオン/オフ比較図。オンはアニメーション自身がキャラクターを前進させ、オフはその場で足踏みしてスクリプトが位置を動かす

オン はアニメーションデータに焼き込まれた移動量でキャラクターが動きます(モーションキャプチャの歩行がそのまま前進する等)。オフ はその場で足踏みするだけで、実際の移動はtransformCharacterControllerのスクリプトが担当します。

初心者向けアドバイス: キャラクターの移動をスクリプトで制御している場合は オフ にしてください。オンのままだと、アニメーションとスクリプトの両方で移動が適用され、キャラクターが二重に進む・滑るといった意図しない動きになります。

State Machineの基本

State Machineの概念図。Idle・Walk・Jumpの3つの状態ノードが遷移の矢印で結ばれ、Any StateからはJump Triggerでどこからでもジャンプへ遷移できる

Animator Windowを開くと、いくつかのStateが最初から用意されています。

State説明
Entryアニメーションの遷移がスタートするState
Any Stateどの状態からでも好きな状態に遷移できるState
ExitSub-State Machineから上位レイヤーに戻る(ルートレイヤーではEntry直後のデフォルトStateに戻る)

Exitの動作について: ExitはSub-State Machine内で使用すると親のState Machineに制御を戻します。ルートレベルのState Machineでは、Exitに遷移するとEntryを経由してデフォルトStateに戻ります。

Stateの作成

  1. Animator Windowの何もないところを右クリック
  2. 「Create State」→「Empty」を選択
  3. アニメーションクリップをMotionフィールドに割り当て

または、Projectウィンドウからアニメーションクリップを直接ドラッグ&ドロップすることで、Stateが自動作成されます。

Transitionの作成

  1. 遷移元のStateを右クリック
  2. 「Make Transition」を選択
  3. 遷移先のStateをクリック

Transitionの設定

設定説明
Has Exit Timeオンでアニメーション終了後に遷移、オフで即座に遷移
Transition Duration遷移の持続時間(ブレンドの滑らかさ)
Conditions遷移が発生する条件
Sponsored

Parametersの使い方

Parameters(パラメータ) は、スクリプトとAnimator Controller間の通信に使用します。

Parametersの種類

種類用途
Float浮動小数点数(例:移動速度)
Int整数(例:弾薬数)
Bool真偽値(例:歩いているかどうか)
Trigger一度だけ発火するフラグ(例:ジャンプ)
Parametersの4種類の比較図。Float(移動速度)・Int(弾薬数)・Bool(歩いているか)・Trigger(ジャンプ)の4枚のカードが並び、スクリプトとAnimatorの通信役であることを示している

Parametersの作成

Animator Windowの左側にある「Parameters」タブをクリックし、「+」ボタンでパラメータを追加します。

スクリプトからAnimatorを制御

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 移動入力を取得
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(horizontal, 0, vertical);
        float speed = movement.magnitude;

        // Animatorのパラメータを設定
        animator.SetFloat("Speed", speed);

        // ジャンプ入力
        if (Input.GetKeyDown(KeyCode.Space))
        {
            animator.SetTrigger("Jump");
        }
    }
}

パラメータの設定メソッド

animator.SetBool("isWalking", true);
animator.SetFloat("Speed", 5.0f);
animator.SetInteger("AmmoCount", 10);
animator.SetTrigger("Jump");

Blend Treeの使い方

Blend Tree(ブレンドツリー) は、複数のアニメーションをパラメータの値に応じてスムーズにブレンドする機能です。

Blend Treeの作成

  1. Animator Windowの何もないところを右クリック
  2. 「Create State」→「From New Blend Tree」を選択
  3. Blend Treeをダブルクリックして編集画面を開く
  4. 「Blend Type」を選択(通常は「1D」)
  5. 「Parameter」を選択(例:「Speed」)
  6. アニメーションクリップを追加してThresholdを設定

例:

  • Idle - Threshold: 0
  • Walk - Threshold: 0.5
  • Run - Threshold: 1.0
1D Blend Treeの概念図。Speedパラメータのスライダー上にIdle(0)・Walk(0.5)・Run(1.0)が並び、0.75あたりのつまみ位置ではWalkとRunが混ざることを示している

これで、Speedの値が中間のときは前後のアニメーションが自動的に混ざります。切り替えの「カクつき」がなくなり、歩き⇔走りが滑らかにつながります。

Sponsored

Animation Layersの使い方

Animation Layers(アニメーションレイヤー) は、複数のState Machineを 重ねて 再生する機能です。1体のキャラクターに「下半身は移動、上半身は別の動作」を同時にさせたいときに使います。

例えば「歩きながら銃を撃つ」を考えてみましょう。移動の歩行モーションを Base Layer(下半身担当)、射撃モーションを Upper Body Layer(上半身担当) として別レイヤーで再生します。このとき Avatar Mask で「このレイヤーは上半身の骨だけ動かす」と指定すると、歩行を崩さずに射撃モーションだけを上から重ねられます。

Animation Layersの概念図。下半身の歩行を担うBase Layerと、上半身の射撃を担うUpper Body Layerを重ね、Avatar Maskで上半身だけ適用して「歩きながら撃つ」を合成する

レイヤーの設定

設定説明
Weightレイヤーの重み(0〜1)。0で無効、1で完全に上書き
BlendingOverride(上書き)またはAdditive(加算)
Maskどの部位にレイヤーを適用するか(Avatar Maskで指定)

移動用のState Machineに攻撃・被弾・射撃…とすべて詰め込むと組み合わせ爆発を起こしますが、レイヤーで分ければ「下半身の状態 × 上半身の状態」を独立に管理できます。

実践:移動・ジャンプ・攻撃をひとつに組む

3Dアクションの主人公、見下ろしARPGの操作キャラ、ソウルライクの敵AI——ジャンルは違っても、キャラクターの土台は「移動(Blend Tree)+割り込みのジャンプ・攻撃」の組み合わせです。ここまで学んだ部品を、ひとつのAnimator Controllerに組み上げてみましょう。

実践で組むAnimator Controllerの全体図。移動はSpeedパラメータのBlend Treeが受け持ち、ジャンプはAny StateからTriggerで割り込み、攻撃はIdleとの間をTriggerと終了時の自動遷移で行き来する

例1:移動アニメーション(Blend Tree + スクリプト)

using UnityEngine;

public class MovementAnimator : MonoBehaviour
{
    [SerializeField] private float walkSpeed = 2f;
    [SerializeField] private float runSpeed = 5f;

    private Animator animator;
    private CharacterController controller;

    // パラメータ名をハッシュ化してパフォーマンス向上
    private static readonly int SpeedHash = Animator.StringToHash("Speed");

    void Start()
    {
        animator = GetComponent<Animator>();
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3(h, 0, v);

        // 走り判定(Shiftキー)
        float targetSpeed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;

        // Blend TreeのThreshold(0〜1)に合わせて正規化
        // move.magnitudeは斜め移動時に√2(≒1.41)になるのでclampで制限
        float normalizedSpeed = Mathf.Clamp01(move.magnitude) * (targetSpeed / runSpeed);
        animator.SetFloat(SpeedHash, normalizedSpeed);

        // 移動処理
        controller.Move(move.normalized * targetSpeed * Time.deltaTime);
    }
}

パフォーマンスTips: Animator.StringToHashでパラメータ名をハッシュ化すると、毎フレームの文字列比較を避けられます。頻繁に呼び出すSetFloatSetBoolでは効果的です。もう1つの利点はタイプミス対策——パラメータ名を打ち間違えてもエラーにならず「無反応」になるだけなので、名前をハッシュ定数1箇所に集約しておくと、間違いに気づきやすくなります。

例2:ジャンプアニメーション

// Any StateからJumpへのTransition設定:
// - Conditions: Jump (Trigger)
// - Has Exit Time: オフ
// - Transition Duration: 0.1

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
        animator.SetTrigger("Jump");
    }
}

例3:攻撃アニメーション(連続攻撃対応)

// Transitionの設定:
// - IdleからAttack: Conditions: Attack (Trigger), Has Exit Time: オフ
// - AttackからIdle: Has Exit Time: オン(攻撃アニメ終了後に自動遷移)

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        animator.SetTrigger("Attack");
    }
}

連打の注意(Triggerは「予約」される): 攻撃モーションの最中にもう一度クリックすると、そのSetTriggerは消えずに予約として残り、Idleへ戻った瞬間に2発目が勝手に出ます。暴発させたくないなら、攻撃中の入力を無視する(攻撃可能な状態のときだけSetTriggerを呼ぶ)か、攻撃の開始時にanimator.ResetTrigger("Attack")で古い予約を消します。逆にこの「予約」を活かせば、格闘ゲームのような先行入力コンボの土台にもなります。

ポイントは2つです。

  • 移動は「値」、ジャンプ・攻撃は「合図」: 常に変化し続ける移動はFloat+Blend Treeに任せ、一瞬の出来事はTriggerで割り込ませます。パラメータ4種の使い分けは、ほぼこの一文に集約されます。
  • 「行き」はHas Exit Timeオフ、「帰り」はオン: 入力への反応は即座に(オフ)、モーションの終わりは最後まで再生してから自動で戻す(オン)。「攻撃が途中で切れる」「攻撃後に戻ってこない」の大半は、この設定の取り違えが原因です。

キャラクターの種類が増えてきたら、この構造ごと使い回して中身のクリップだけを差し替えられます。それが次のAnimator Override Controllerです。

Animator Override Controller

Animator Override Controller は、既存のAnimator Controllerの構造(State Machine、Transition)を再利用しながら、アニメーションクリップだけを差し替える機能です。

用途

  • 敵キャラのバリエーション(同じ動きだが見た目が違う)
  • 武器ごとの攻撃モーション差し替え
  • キャラクターのスキン違い

作成方法

  1. Projectウィンドウで右クリック → Create → Animator Override Controller
  2. 「Controller」フィールドに元となるAnimator Controllerを設定
  3. リストに表示されるアニメーションを差し替え
// スクリプトから動的に差し替える場合
public AnimatorOverrideController slimeOverride;
public AnimatorOverrideController goblinOverride;

void SetEnemyType(EnemyType type)
{
    animator.runtimeAnimatorController = type == EnemyType.Slime
        ? slimeOverride
        : goblinOverride;
}

おまけ:先に知っておくと良いこと

Animator Controllerが組めるようになると、次はこのあたりが視野に入ってきます。名前だけでも知っておくと迷いません。

  • アニメーションの途中で処理を呼べる(Animation Event): 「足が地面に着いた瞬間に足音を鳴らす」「攻撃の振り抜きに合わせてダメージ判定を出す」には、クリップに Animation Event を仕込んでスクリプトの関数を呼び出すのが定番です。
  • 画面外のAnimatorは自動で省ける(Culling Mode): AnimatorコンポーネントのCulling ModeCull Update Transformsにすると、カメラに映っていないキャラクターの計算を減らせます。キャラクターを大量に出すゲームで効いてきます。
  • HumanoidとGenericはインポート設定の話: 人型キャラ同士でアニメーションを使い回すための Humanoid 設定は 3Dモデルインポートの記事 で解説しています。また、2DスプライトのアニメもこのAnimator Controllerで同じように制御できます(2Dアニメーションの記事)。

まとめ

Animator Controllerは、Unity公式のアニメーション管理システムです。

  • State Machine で複数のアニメーションを視覚的に管理
  • Parameters でスクリプトからアニメーションを制御
  • Transition でアニメーション間の遷移を設定
  • Blend Tree で複数のアニメーションをスムーズにブレンド
  • Animation Layers で複数のアニメーションを重ね合わせ

まずはIdle・Walk・Jumpの3状態から。あなたのキャラクターには、どんな「状態」がありそうですか?

ここまでの基本を押さえたら、次は3Dキャラクター特有のテクニックです。8方向移動(2D Blend Tree)・上半身だけの制御(Avatar Mask)・Root Motionの使い分け3Dキャラクターアニメーション実践 で解説しています。

さらに学ぶために