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ファイルの作成
手順:
- Projectウィンドウで右クリック
- Create > Animator Controller を選択
- ファイル名を入力(例:
PlayerAnimator)
2. GameObjectへのAnimatorコンポーネントのアタッチ
アニメーションを再生したい GameObject に、Animator コンポーネントを追加します。
手順:
Hierarchyでアニメーション対象のGameObjectを選択InspectorでAdd ComponentをクリックAnimatorと入力して追加
3. Animator Controllerの割り当て
手順:
AnimatorコンポーネントのControllerフィールドに、作成したAnimator Controllerをドラッグ&ドロップ
これで準備完了です。
Stateの作成と設定
Animator Controllerウィンドウで、アニメーションのStateを作成します。
Animator Controllerウィンドウを開く
手順:
- Projectウィンドウで作成した
Animator Controllerをダブルクリック Animatorウィンドウが開きます(Window > Animation >Animatorからも開ける)
Stateの作成
手順:
- Animatorウィンドウ内で右クリック
- Create State > Empty を選択
- 作成されたStateを選択し、Inspectorで名前を変更(例:
Idle) Motionフィールドに、アニメーションクリップをドラッグ&ドロップ
もしくは、AnimationClipをAnimatorウィンドウ内にドラッグ&ドロップすることで、
Motion を割り当てた State を作成することもできます。
Default State(初期状態)の設定
最初に再生されるStateをDefault Stateとして設定します。
手順:
- 初期状態にしたいStateを右クリック
Set as Layer Default Stateを選択
Default Stateはオレンジ色で表示されます。
各Stateの役割
キャラクターアニメーションの例:
- Idle - 待機(何もしていない状態)
- Walk - 歩行(ゆっくり移動)
- Run - 走行(速く移動)
- Jump - ジャンプ(空中にいる状態)
- Attack - 攻撃(武器を振る)
Transitionの設定
State間の遷移を設定します。
Transitionの作成
手順:
- 遷移元のStateを右クリック
Transitionの遷移元でMake Transitionを選択- 遷移先の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の作成
手順:
Animatorウィンドウ左側の Parameters タブを選択- + ボタンをクリック
- パラメータの種類を選択(
Float,Int,Bool,Trigger) - 名前を入力(例:
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を使用
手順:
- Transitionを選択
- Inspectorの Conditions で + をクリック
- Parameterを選択し、条件を設定
例:
SpeedGreater0.1→ Speedが0.1より大きいIsGroundedtrue → 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:
Speed(Float)- 移動速度Jump(Trigger)- ジャンプAttack(Trigger)- 攻撃
Idle → Walk → Run の遷移
設定:
- Idle → Walk
- Condition:
Speed > 0.1 Has Exit Time: OFFTransition Duration: 0.25
- Condition:
- Walk → Run
- Condition:
Speed > 5.0 Has Exit Time: OFFTransition Duration: 0.25
- Condition:
- Run → Walk
- Condition:
Speed < 5.0 Has Exit Time: OFFTransition Duration: 0.25
- Condition:
- Walk → Idle
- Condition:
Speed < 0.1 Has Exit Time: OFFTransition Duration: 0.25
- Condition:
ジャンプアニメーションの実装
設定:
- Any State → Jump
- Condition:
Jumptrigger Has Exit Time: OFFTransition Duration: 0.1
- Condition:
- Jump → Idle
- Condition: なし
Has Exit Time: ONExit Time: 0.9(アニメーションの90%再生後)Transition Duration: 0.2
Any Stateとは: どのStateからでも遷移できる特殊なStateです。ジャンプや攻撃など、いつでも実行できるアニメーションに使います。
攻撃アニメーションの実装
設定:
- Any State → Attack
- Condition:
Attacktrigger Has Exit Time: OFFTransitionDuration: 0.1
- Condition:
- Attack → Idle
- Condition: なし
Has Exit Time: ONExit Time: 1.0(アニメーション終了後)TransitionDuration: 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に留めるTransitionDurationを短く - 滑らかさとパフォーマンスのバランス
スクリプトでの最適化:
// 良い例:ハッシュ値を使う(高速)
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!