動作確認環境: Unity 2022.3 LTS / Unity 6
歩き・走り・ジャンプ・攻撃——アニメーションクリップは用意できたのに、いざ「状況に応じて切り替える」となると、どこから手を付ければいいのか分からない。キャラクターを動かし始めた誰もが、最初にぶつかる壁です。
Animator Controller(アニメーターコントローラー) は、Unity公式のアニメーション管理システムです。複数のアニメーションクリップを視覚的に管理し、State Machine(ステートマシン)を使って「いつ・どのアニメーションを再生するか」を矢印でつないで設計できます。
この記事でわかること
- Animator Controllerの作成と割り当て(Apply Root Motionの落とし穴含む)
- State Machine——Entry・Any State・Exitと状態遷移の基本
- Parameters(Float/Int/Bool/Trigger)とスクリプトからの制御
- Blend Tree で歩き⇔走りを滑らかに切り替える
- Animation Layers で「歩きながら撃つ」を上半身だけ重ねる
- ジャンプ・攻撃・連続攻撃の実践的なTransition 設定
Animator Controllerの作成方法
方法1:手動で作成
- Projectウィンドウで右クリック
- 「Create」→「Animator Controller」を選択
- ファイル名を設定(例:「PlayerAnimator」)
方法2:自動作成
Animation Windowでゲームオブジェクトをアニメーション化すると、Animator Controllerが自動的に作成されます。
ゲームオブジェクトに割り当てる
- ゲームオブジェクトを選択
- インスペクターで「Add Component」→「Animator」を選択
- AnimatorコンポーネントのControllerフィールドに、作成したAnimator Controllerをドラッグ&ドロップ
Apply Root Motionについて
Animatorコンポーネントには「Apply Root Motion」というチェックボックスがあります。
| 設定 | 動作 |
|---|---|
| オン | アニメーションに含まれる移動・回転がキャラクターに適用される |
| オフ | アニメーションの移動・回転は無視され、スクリプトで制御する |

オン はアニメーションデータに焼き込まれた移動量でキャラクターが動きます(モーションキャプチャの歩行がそのまま前進する等)。オフ はその場で足踏みするだけで、実際の移動はtransformやCharacterControllerのスクリプトが担当します。
初心者向けアドバイス: キャラクターの移動をスクリプトで制御している場合は オフ にしてください。オンのままだと、アニメーションとスクリプトの両方で移動が適用され、キャラクターが二重に進む・滑るといった意図しない動きになります。
State Machineの基本

Animator Windowを開くと、いくつかのStateが最初から用意されています。
| State | 説明 |
|---|---|
| Entry | アニメーションの遷移がスタートするState |
| Any State | どの状態からでも好きな状態に遷移できるState |
| Exit | Sub-State Machineから上位レイヤーに戻る(ルートレイヤーではEntry直後のデフォルトStateに戻る) |
Exitの動作について: ExitはSub-State Machine内で使用すると親のState Machineに制御を戻します。ルートレベルのState Machineでは、Exitに遷移するとEntryを経由してデフォルトStateに戻ります。
Stateの作成
- Animator Windowの何もないところを右クリック
- 「Create State」→「Empty」を選択
- アニメーションクリップをMotionフィールドに割り当て
または、Projectウィンドウからアニメーションクリップを直接ドラッグ&ドロップすることで、Stateが自動作成されます。
Transitionの作成
- 遷移元のStateを右クリック
- 「Make Transition」を選択
- 遷移先の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の作成
- Animator Windowの何もないところを右クリック
- 「Create State」→「From New Blend Tree」を選択
- Blend Treeをダブルクリックして編集画面を開く
- 「Blend Type」を選択(通常は「1D」)
- 「Parameter」を選択(例:「Speed」)
- アニメーションクリップを追加してThresholdを設定
例:
- Idle - Threshold: 0
- Walk - Threshold: 0.5
- Run - Threshold: 1.0

これで、Speedの値が中間のときは前後のアニメーションが自動的に混ざります。切り替えの「カクつき」がなくなり、歩き⇔走りが滑らかにつながります。
Animation Layersの使い方
Animation Layers(アニメーションレイヤー) は、複数のState Machineを 重ねて 再生する機能です。1体のキャラクターに「下半身は移動、上半身は別の動作」を同時にさせたいときに使います。
例えば「歩きながら銃を撃つ」を考えてみましょう。移動の歩行モーションを Base Layer(下半身担当)、射撃モーションを Upper Body Layer(上半身担当) として別レイヤーで再生します。このとき Avatar Mask で「このレイヤーは上半身の骨だけ動かす」と指定すると、歩行を崩さずに射撃モーションだけを上から重ねられます。

レイヤーの設定
| 設定 | 説明 |
|---|---|
| Weight | レイヤーの重み(0〜1)。0で無効、1で完全に上書き |
| Blending | Override(上書き)またはAdditive(加算) |
| Mask | どの部位にレイヤーを適用するか(Avatar Maskで指定) |
移動用のState Machineに攻撃・被弾・射撃…とすべて詰め込むと組み合わせ爆発を起こしますが、レイヤーで分ければ「下半身の状態 × 上半身の状態」を独立に管理できます。
実践:移動・ジャンプ・攻撃をひとつに組む
3Dアクションの主人公、見下ろしARPGの操作キャラ、ソウルライクの敵AI——ジャンルは違っても、キャラクターの土台は「移動(Blend Tree)+割り込みのジャンプ・攻撃」の組み合わせです。ここまで学んだ部品を、ひとつのAnimator Controllerに組み上げてみましょう。

例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でパラメータ名をハッシュ化すると、毎フレームの文字列比較を避けられます。頻繁に呼び出すSetFloatやSetBoolでは効果的です。もう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)を再利用しながら、アニメーションクリップだけを差し替える機能です。
用途
- 敵キャラのバリエーション(同じ動きだが見た目が違う)
- 武器ごとの攻撃モーション差し替え
- キャラクターのスキン違い
作成方法
- Projectウィンドウで右クリック → Create → Animator Override Controller
- 「Controller」フィールドに元となるAnimator Controllerを設定
- リストに表示されるアニメーションを差し替え
// スクリプトから動的に差し替える場合
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 ModeをCull 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キャラクターアニメーション実践 で解説しています。