Animator Controller とは?

Animator Controller は、Unityでアニメーションを管理・制御するための仕組みです。キャラクターやオブジェクトの状態に応じて、適切なアニメーションを自動的に切り替えることができます。

例えば、キャラクターが以下のような動作をする場合:

  • 止まっている時は「待機アニメーション」
  • 歩いている時は「歩行アニメーション」
  • 走っている時は「走行アニメーション」
  • ジャンプした時は「ジャンプアニメーション」

これらのアニメーションを状態に応じて自動的に切り替えるのが、Animator Controllerの役割です。

アニメーションを管理する仕組み

Animator Controllerステートマシンとして動作します。ステートマシンとは、複数の「状態(State)」を持ち、条件に応じて状態を切り替える仕組みです。

Animator Controllerの基本構成要素

Animator Controllerは、以下の4つの要素で構成されています。

1. State(ステート)

  • Stateは、アニメーションの「状態」を表します。各Stateには1つのアニメーションクリップが割り当てられます。

例:

  • Idle State - 待機アニメーション
  • Walk State - 歩行アニメーション
  • Run State - 走行アニメーション
  • Jump State - ジャンプアニメーション

2. Transition(遷移)

  • Transitionは、State間の「遷移」を定義します。どのような条件で、どのStateに切り替わるかを設定します。

例:

  • Idle → Walk:「Speed」パラメータが 0.1 以上になったら
  • Walk → Run:「Speed」パラメータが 5.0 以上になったら
  • Any State → Jump:「Jump」トリガーが発火したら

3. Parameters(パラメータ)

  • Parametersは、Transitionの条件として使用する「変数」です。スクリプトから値を設定することで、アニメーションを動的に制御できます。

パラメータの種類:

  • Float - 小数値(例:移動速度)
  • Int - 整数値(例:HP、コンボ数)
  • Bool - 真偽値(例:地面にいるか)
  • Trigger - 一度だけ発火する信号(例:ジャンプ、攻撃)

4. Layers(レイヤー)

  • Layersは、複数のアニメーションを重ね合わせる機能です。
  • 例えば、下半身は「走るアニメーション」、上半身は「武器を構えるアニメーション」を同時に再生できます。

Animator Controllerの作成

1. Animator Controllerファイルの作成

手順:

  1. Projectウィンドウで右クリック
  2. Create > Animator Controller を選択
  3. ファイル名を入力(例:PlayerAnimator

2. GameObjectへのAnimatorコンポーネントのアタッチ

アニメーションを再生したい GameObject に、Animator コンポーネントを追加します。

手順:

  1. Hierarchy でアニメーション対象の GameObject を選択
  2. InspectorAdd Component をクリック
  3. Animator と入力して追加

3. Animator Controllerの割り当て

手順:

  1. Animator コンポーネントの Controller フィールドに、作成した Animator Controller をドラッグ&ドロップ

これで準備完了です。

Stateの作成と設定

Animator Controllerウィンドウで、アニメーションのStateを作成します。

Animator Controllerウィンドウを開く

手順:

  1. Projectウィンドウで作成したAnimator Controllerをダブルクリック
  2. Animatorウィンドウが開きます(Window > Animation > Animator からも開ける)

Stateの作成

手順:

  1. Animatorウィンドウ内で右クリック
  2. Create State > Empty を選択
  3. 作成されたStateを選択し、Inspectorで名前を変更(例:Idle
  4. Motion フィールドに、アニメーションクリップをドラッグ&ドロップ

もしくは、AnimationClipをAnimatorウィンドウ内にドラッグ&ドロップすることで、

Motion を割り当てた State を作成することもできます。

Default State(初期状態)の設定

最初に再生されるStateをDefault Stateとして設定します。

手順:

  1. 初期状態にしたいStateを右クリック
  2. Set as Layer Default State を選択

Default Stateはオレンジ色で表示されます。

各Stateの役割

キャラクターアニメーションの例:

  • Idle - 待機(何もしていない状態)
  • Walk - 歩行(ゆっくり移動)
  • Run - 走行(速く移動)
  • Jump - ジャンプ(空中にいる状態)
  • Attack - 攻撃(武器を振る)

Transitionの設定

State間の遷移を設定します。

Transitionの作成

手順:

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

矢印が表示され、Transitionが作成されます。

遷移条件の設定

Transition を選択し、Inspector で条件を設定します。

主な設定項目:

Has Exit Time

  • ON: アニメーションが終了するまで待ってから遷移
  • OFF: 条件を満たしたら即座に遷移

Exit Time には正規化時間(0〜1)で値を指定します。例えば「0.9」は「アニメーションの90%が再生されたタイミングで遷移」を意味します。

使い分け:

  • 攻撃アニメーションなど、最後まで再生したい場合は ON
  • 移動アニメーションなど、即座に切り替えたい場合は OFF

Transition Duration

遷移にかかる時間です。値を大きくすると、滑らかに遷移します。

  • 0: 瞬時に切り替わる
  • 0.25: 0.25秒かけて徐々に切り替わる

Fixed Duration チェックボックスがONの場合は秒数、OFFの場合は正規化時間(0〜1)で指定します。

Conditions(条件)

Parametersを使って、遷移の条件を設定します。

例:

  • Speed が 0.1 より大きい場合に遷移
  • IsGrounded が true の場合に遷移
  • Jump トリガーが発火した場合に遷移

Parametersの活用

アニメーションを制御するためのパラメータを作成します。

Parameterの作成

手順:

  1. Animator ウィンドウ左側の Parameters タブを選択
  2. + ボタンをクリック
  3. パラメータの種類を選択(Float, Int, Bool, Trigger
  4. 名前を入力(例:Speed

Parameter の種類と使い分け

Float(小数値)

連続的な値を扱う場合に使用します。

用途:

  • 移動速度(Speed)
  • ジャンプの高さ

例:

Speed > 0.1 : Idle → Walk
Speed > 5.0 : Walk → Run

Int(整数値)

カウントや段階的な値を扱う場合に使用します。

用途:

  • コンボ数
  • 攻撃の種類(1: 弱攻撃、2: 強攻撃)

Bool(真偽値)

ON/OFFの状態を扱う場合に使用します。

用途:

  • 地面にいるか(IsGrounded)
  • ダメージを受けているか(IsDamaged)

Trigger(トリガー)

一度だけ発火する信号です。自動的にリセットされます。

用途:

  • ジャンプ(Jump)
  • 攻撃(Attack)
  • 死亡(Die)

Triggerの特徴:

  • スクリプトからSetTrigger()で発火
  • 遷移が実行されると自動的にリセット
  • 何度も発火させることができる

Transitionの条件にParameterを使用

手順:

  1. Transitionを選択
  2. Inspectorの Conditions+ をクリック
  3. Parameterを選択し、条件を設定

例:

  • Speed Greater 0.1 → Speedが0.1より大きい
  • IsGrounded true → IsGroundedがtrueの場合
  • Jump → Jumpトリガーが発火した場合

スクリプトからの制御

C#スクリプトからAnimatorを制御して、アニメーションを動的に切り替えます。

Animatorコンポーネントの取得

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Animator _animator;

    private void Start()
    {
        // Animatorコンポーネントを取得
        _animator = GetComponent<Animator>();
    }
}

パラメータの設定方法

SetFloat - Float型パラメータの設定

// 移動速度をアニメーターに渡す
_animator.SetFloat("Speed", moveSpeed);

SetInt - Int型パラメータの設定

// コンボ数を設定
_animator.SetInt("ComboCount", comboCount);

SetBool - Bool型パラメータの設定

// 地面にいるかどうかを設定
_animator.SetBool("IsGrounded", isGrounded);

SetTrigger - Triggerの発火

// ジャンプアニメーションをトリガー
_animator.SetTrigger("Jump");

アニメーションの動的な切り替え

キャラクターの移動速度に応じてアニメーションを切り替える実装例:

using UnityEngine;

public class PlayerAnimationController : MonoBehaviour
{
    [SerializeField] private float _moveSpeed = 5f;
    [SerializeField] private float _runSpeed = 10f;

    private Animator _animator;
    private Rigidbody _rigidbody;

    private void Start()
    {
        _animator = GetComponent<Animator>();
        _rigidbody = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        // 移動入力を取得
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        // 移動方向を計算
        Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;

        // 移動速度を計算
        float speed = direction.magnitude * _moveSpeed;

        // 走る入力があれば速度を上げる
        if (Input.GetKey(KeyCode.LeftShift))
        {
            speed = direction.magnitude * _runSpeed;
        }

        // Animatorに速度を渡す
        _animator.SetFloat("Speed", speed);

        // 移動処理
        if (direction.magnitude > 0.1f)
        {
            _rigidbody.MovePosition(transform.position + direction * speed * Time.deltaTime);
        }

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

実践例:キャラクターアニメーション

実際のアクションゲームでよく使われるキャラクターアニメーションの実装例です。

Animator Controllerの構成

States:

  • Idle(待機)
  • Walk(歩行)
  • Run(走行)
  • Jump(ジャンプ)
  • Attack(攻撃)

Parameters:

  • SpeedFloat)- 移動速度
  • JumpTrigger)- ジャンプ
  • AttackTrigger)- 攻撃

Idle → Walk → Run の遷移

設定:

  1. Idle → Walk
    • Condition: Speed > 0.1
    • Has Exit Time: OFF
    • Transition Duration: 0.25
  2. Walk → Run
    • Condition: Speed > 5.0
    • Has Exit Time: OFF
    • Transition Duration: 0.25
  3. Run → Walk
    • Condition: Speed < 5.0
    • Has Exit Time: OFF
    • Transition Duration: 0.25
  4. Walk → Idle
    • Condition: Speed < 0.1
    • Has Exit Time: OFF
    • Transition Duration: 0.25

ジャンプアニメーションの実装

設定:

  1. Any State → Jump
    • Condition: Jump trigger
    • Has Exit Time: OFF
    • Transition Duration: 0.1
  2. Jump → Idle
    • Condition: なし
    • Has Exit Time: ON
    • Exit Time: 0.9(アニメーションの90%再生後)
    • Transition Duration: 0.2

Any Stateとは: どのStateからでも遷移できる特殊なStateです。ジャンプや攻撃など、いつでも実行できるアニメーションに使います。

攻撃アニメーションの実装

設定:

  1. Any State → Attack
    • Condition: Attack trigger
    • Has Exit Time: OFF
    • Transition Duration: 0.1
  2. Attack → Idle
    • Condition: なし
    • Has Exit Time: ON
    • Exit Time: 1.0(アニメーション終了後)
    • Transition Duration: 0.2

ポイント:

  • 攻撃アニメーションは最後まで再生する必要があるため、Has Exit Time をONにする
  • Exit Time を1.0にすることで、アニメーションが完全に終了してから遷移

完全な実装スクリプト

using UnityEngine;

public class CharacterAnimator : MonoBehaviour
{
    [SerializeField] private float _walkSpeed = 3f;
    [SerializeField] private float _runSpeed = 8f;
    [SerializeField] private float _jumpForce = 5f;

    private Animator _animator;
    private Rigidbody _rigidbody;
    private bool _isGrounded = true;

    private void Start()
    {
        _animator = GetComponent<Animator>();
        _rigidbody = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        // 移動処理
        HandleMovement();

        // ジャンプ処理
        HandleJump();

        // 攻撃処理
        HandleAttack();
    }

    private void HandleMovement()
    {
        // 入力取得
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;

        // 速度計算
        float speed = 0f;
        if (direction.magnitude > 0.1f)
        {
            // 走る入力があれば走行速度
            if (Input.GetKey(KeyCode.LeftShift))
            {
                speed = _runSpeed;
            }
            else
            {
                speed = _walkSpeed;
            }

            // 移動
            _rigidbody.MovePosition(transform.position + direction * speed * Time.deltaTime);
        }

        // Animatorに速度を渡す
        _animator.SetFloat("Speed", speed);
    }

    private void HandleJump()
    {
        // ジャンプ入力かつ地面にいる場合
        if (Input.GetKeyDown(KeyCode.Space) && _isGrounded)
        {
            // ジャンプアニメーションをトリガー
            _animator.SetTrigger("Jump");

            // ジャンプの物理処理
            _rigidbody.AddForce(Vector3.up * _jumpForce, ForceMode.Impulse);
            _isGrounded = false;
        }
    }

    private void HandleAttack()
    {
        // 攻撃入力
        if (Input.GetMouseButtonDown(0))
        {
            // 攻撃アニメーションをトリガー
            _animator.SetTrigger("Attack");
        }
    }

    // 地面との接触判定
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            _isGrounded = true;
        }
    }
}

注意点とベストプラクティス

1. Transitionの設定ミスによる問題

問題:アニメーションが切り替わらない

原因:

  • 条件が間違っている
  • Has Exit Time が意図せずONになっている
  • Parameter の名前が間違っている

対処法:

  • Animator ウィンドウを再生モードで確認
  • Parameters の値が変化しているか確認
  • Transition の条件を再確認

2. Has Exit Timeの使い分け

Has Exit Time ON:

  • アニメーションを最後まで再生したい場合
  • 攻撃、スキル発動など

Has Exit Time OFF:

  • 即座に切り替えたい場合
  • 移動アニメーション(Idle, Walk, Run

誤った使い方: 移動アニメーションで Has Exit Time をONにすると、 アニメーションが終わるまで次のアニメーションに切り替わらず、動きがカクカクになります。

3. パフォーマンスへの影響

Animator Controllerの最適化:

  • 不要な Transition を削除 - 使わない遷移は削除する
  • Layer の数を減らす - 必要最小限の Layer に留める
  • Transition Durationを短く - 滑らかさとパフォーマンスのバランス

スクリプトでの最適化:

// 良い例:ハッシュ値を使う(高速)
private readonly int _speedHash = Animator.StringToHash("Speed");

private void Update()
{
    _animator.SetFloat(_speedHash, speed);
}

// 悪い例:文字列を毎回使う(低速)
private void Update()
{
    _animator.SetFloat("Speed", speed); // 毎回文字列検索が発生
}

まとめ

Animator Controller は、Unityでアニメーションを管理・制御するための強力なツールです。

重要なポイント

  • Stateでアニメーションの状態を定義
  • TransitionでState間の遷移条件を設定
  • Parametersでスクリプトからアニメーションを制御
  • Layersで複数のアニメーションを重ね合わせ
  • Has Exit Timeの使い分けが重要
  • パフォーマンス最適化にはハッシュ値を使用

効果的な使い方

以下のような場面でAnimator Controllerを活用してください:

  • キャラクターの状態に応じたアニメーション切り替え
  • 入力に応じたインタラクティブなアニメーション
  • 複雑なアニメーションシーケンスの管理
  • キャラクター向けの説明をしてきましたが、UIなどにも使えます

Animator Controllerを使いこなして、生き生きとしたキャラクターアニメーションを実現しましょう!

📣おしらせ!

Unity Asset Storeで

世界を揺るがすフラッシュセール

が開催中です。

最高のワールド制作に必要なすべてが、24時間限定で70% OFF!

フラッシュセール

50%オフ