概要
動作確認環境: Unity 2022.3 LTS / Unity 6
「キャラクターに複数のアニメーションを付けたい…」「歩きからジャンプへスムーズに切り替えたい…」
Unity開発でキャラクターやオブジェクトにアニメーションを実装していると、こうした課題に直面することがあります。Animator Controller(アニメーターコントローラー) は、Unity公式のアニメーション管理システムです。複数のアニメーションクリップを視覚的に管理し、State Machine(ステートマシン)を使って、アニメーション間の遷移を制御します。
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」というチェックボックスがあります。
| 設定 | 動作 |
|---|---|
| オン | アニメーションに含まれる移動・回転がキャラクターに適用される |
| オフ | アニメーションの移動・回転は無視され、スクリプトで制御する |
初心者向けアドバイス: キャラクターの移動をスクリプトで制御している場合は オフ にしてください。オンのままだと、アニメーションとスクリプトの両方で移動が適用され、意図しない動きになることがあります。
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
Animation Layersの使い方
Animation Layers(アニメーションレイヤー) は、複数のState Machineを重ねて使用する機能です。
例えば、全身の歩きアニメーションを再生しながら、上半身だけ攻撃アニメーションを再生できます。
レイヤーの設定
| 設定 | 説明 |
|---|---|
| Weight | レイヤーの重み(0〜1) |
| Blending | Override(上書き)または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でパラメータ名をハッシュ化すると、毎フレームの文字列比較を避けられます。頻繁に呼び出すSetFloatやSetBoolでは効果的です。
例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)を再利用しながら、アニメーションクリップだけを差し替える機能です。
用途
- 敵キャラのバリエーション(同じ動きだが見た目が違う)
- 武器ごとの攻撃モーション差し替え
- キャラクターのスキン違い
作成方法
- 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は、Unity公式のアニメーション管理システムです。
- State Machine で複数のアニメーションを視覚的に管理
- Parameters でスクリプトからアニメーションを制御
- Transition でアニメーション間の遷移を設定
- Blend Tree で複数のアニメーションをスムーズにブレンド
- Animation Layers で複数のアニメーションを重ね合わせ
ぜひ、Animator Controllerを活用して、キャラクターに生き生きとしたアニメーションを実装してください。