【Unity】Unity 3Dキャラクターアニメーション:Animatorとステートマシンを制する

作成: 2025-12-07

3Dキャラクターに命を吹き込むAnimatorコントローラー。待機、歩行、走行、ジャンプといった状態をステートマシンで管理し、パラメータとトランジションを使って滑らかにアニメーションを切り替える方法を解説します。

概要

3Dキャラクターを動かすためには、モデルにリグ(骨格)を入れ、アニメーションクリップを作成するだけでは不十分です。プレイヤーの入力やゲームの状況に応じて、「待機」から「歩き」へ、「歩き」から「走り」へ、そしてどんな状態からでも「ジャンプ」へ、といったように、適切なアニメーションを適切なタイミングで切り替える仕組みが必要です。この複雑な状態遷移を管理するのが、Animatorコントローラー (Animator Controller) です。

Animatorコントローラーは、アニメーションクリップを「ステート(状態)」として視覚的に配置し、それらの間を「トランジション(遷移)」で結んだ**ステートマシン(状態遷移図)**を構築するための強力なツールです。2Dアニメーションでも同様の仕組みを使いますが、3D、特にHumanoidリグを持つキャラクターでは、より高度で柔軟な機能が利用できます。

この記事では、3Dキャラクターの基本的なアクション(待機、歩行、走行)をAnimatorコントローラーで管理する基本的なワークフローを解説します。

HumanoidリグとAvatarの重要性

3Dキャラクターのアニメーションについて語る上で、HumanoidリグとAvatarシステムの理解は欠かせません。モデルのインポート設定でRigタブのAnimation TypeHumanoidに設定すると、Unityはモデルの骨格構造を標準的な人型ボーンマップにマッピングしたAvatarアセットを生成します。

このAvatarのおかげで、**全く異なるモデル間でアニメーションを再利用(リターゲティング)**することが可能になります。例えば、あるキャラクターのために作られた「歩き」アニメーションを、背丈も体型も違う別のキャラクターにそのまま適用できるのです。これは、アセットストアで購入したアニメーションを使ったり、チーム内でアニメーションを共有したりする上で非常に強力な機能です。

Animatorコントローラーの構築

Step 1: パラメータの定義

まず、スクリプトからアニメーションの状態を制御するための「変数」となるパラメータを定義します。キャラクターの移動を例に取ると、最低でも移動速度を制御するパラメータが必要です。

  1. Animatorウィンドウを開き、Parametersタブを選択します。
  2. +ボタンをクリックし、Float型のパラメータを2つ作成します。
    • ForwardSpeed: 前後の移動速度を表す。
    • RightSpeed: 左右の移動速度を表す。

Step 2: Blend Treeで滑らかな移動を実現する

待機(Idle)、歩き(Walk)、走り(Run)のように、キャラクターの速度に応じてアニメーションを滑らかに変化させたい場合、ステートを個別に作ってトランジションで繋ぐのは非常に面倒です。このような連続的な変化を扱うのに最適なのがBlend Tree (ブレンドツリー) です。

  1. Animatorウィンドウの空いている場所で右クリックし、Create State > From New Blend Treeを選択します。
  2. 作成されたBlend Treeステートをダブルクリックして、編集モードに入ります。
  3. Blend Treeを選択し、InspectorでBlend Type2D Freeform Cartesianに変更します。これにより、2つのパラメータ(今回はX軸にRightSpeed、Y軸にForwardSpeed)を使ってアニメーションをブレンドできるようになります。
  4. Add Motion Fieldをクリックし、キャラクターの動きに対応するアニメーションクリップを登録していきます。
    • Pos X: 0, Pos Y: 0: 待機 (Idle) アニメーション
    • Pos X: 0, Pos Y: 0.5: 前進歩行 (Walk Forward) アニメーション
    • Pos X: 0, Pos Y: 1: 前進走行 (Run Forward) アニメーション
    • Pos X: 1, Pos Y: 0: 右移動 (Strafe Right) アニメーション
    • Pos X: -1, Pos Y: 0: 左移動 (Strafe Left) アニメーション

これで、ForwardSpeedRightSpeedのパラメータ値に応じて、これらのアニメーションが自動的に滑らかにブレンドされるようになります。例えば、ForwardSpeed0.75なら、歩行と走行のアニメーションが半分ずつ混ざった「早歩き」のような動きが生成されます。

Step 3: レイヤーとアバターマスク

より複雑な制御のために、Animatorコントローラーはレイヤー (Layers) という機能を持っています。例えば、上半身(武器を振るなど)と下半身(歩く、走るなど)で別々のアニメーションを再生したい場合にレイヤーを使います。

  • Layersタブで+ボタンを押して新しいレイヤーを追加します。
  • Weight1に設定し、歯車アイコンからBlendingOverride(上書き)またはAdditive(加算)に設定します。
  • Avatar Maskを作成し、このレイヤーが影響する体の部位(例: 上半身のみ)を指定します。

これにより、「走りながらリロードする」といった複合的なアクションを実装できます。

スクリプトからの制御

最後に、スクリプトからキャラクターの移動量などを計算し、Animatorのパラメータに渡します。

using UnityEngine;

[RequireComponent(typeof(Animator))]
public class CharacterAnimatorController : MonoBehaviour
{
    private Animator animator;

    // Animatorのパラメータ名をID化しておくと高速かつ安全
    private readonly int forwardSpeedHash = Animator.StringToHash("ForwardSpeed");
    private readonly int rightSpeedHash = Animator.StringToHash("RightSpeed");

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 入力やAIから移動ベクトルを取得(-1.0f ~ 1.0fの範囲)
        float horizontalInput = Input.GetAxis("Horizontal"); // A, Dキー
        float verticalInput = Input.GetAxis("Vertical");     // W, Sキー

        // Animatorのパラメータを更新
        // SetFloatの第3引数 (dampTime) を使うと、値が滑らかに変化し、動きの遷移が自然になる
        animator.SetFloat(forwardSpeedHash, verticalInput, 0.1f, Time.deltaTime);
        animator.SetFloat(rightSpeedHash, horizontalInput, 0.1f, Time.deltaTime);
    }
}

まとめ

Animatorコントローラーは、3Dキャラクターアニメーションの心臓部です。

  • HumanoidリグとAvatarにより、アニメーションの再利用が可能になる。
  • Animator Controllerは、アニメーションのステートマシンを構築するツール。
  • 速度など連続的に変化する状態にはBlend Treeを使うと、滑らかなアニメーション遷移が簡単に実装できる。
  • 上半身と下半身で別のアニメーションを再生するには、LayersAvatar Maskを活用する。
  • スクリプトからSetFloatなどのメソッドでパラメータを更新し、アニメーションを制御する。

これらの機能を組み合わせることで、プレイヤーの操作に生き生きと反応する、説得力のあるキャラクターの動きを実現することができます。