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

作成: 2026-02-05

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

概要

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

「キャラクターに複数のアニメーションを付けたい…」「歩きからジャンプへスムーズに切り替えたい…」

Unity開発でキャラクターやオブジェクトにアニメーションを実装していると、こうした課題に直面することがあります。Animator Controller(アニメーターコントローラー) は、Unity公式のアニメーション管理システムです。複数のアニメーションクリップを視覚的に管理し、State Machine(ステートマシン)を使って、アニメーション間の遷移を制御します。

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」というチェックボックスがあります。

設定動作
オンアニメーションに含まれる移動・回転がキャラクターに適用される
オフアニメーションの移動・回転は無視され、スクリプトで制御する

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

State Machineの基本

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遷移が発生する条件

Parametersの使い方

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

Parametersの種類

種類用途
Float浮動小数点数(例:移動速度)
Int整数(例:弾薬数)
Bool真偽値(例:歩いているかどうか)
Trigger一度だけ発火するフラグ(例:ジャンプ)

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

Animation Layersの使い方

Animation Layers(アニメーションレイヤー) は、複数のState Machineを重ねて使用する機能です。

例えば、全身の歩きアニメーションを再生しながら、上半身だけ攻撃アニメーションを再生できます。

レイヤーの設定

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

実践的な使用例

例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では効果的です。

例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");
    }
}

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は、Unity公式のアニメーション管理システムです。

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

ぜひ、Animator Controllerを活用して、キャラクターに生き生きとしたアニメーションを実装してください。

さらに学ぶために