概要
3Dキャラクターを動かすためには、モデルにリグ(骨格)を入れ、アニメーションクリップを作成するだけでは不十分です。プレイヤーの入力やゲームの状況に応じて、「待機」から「歩き」へ、「歩き」から「走り」へ、そしてどんな状態からでも「ジャンプ」へ、といったように、適切なアニメーションを適切なタイミングで切り替える仕組みが必要です。この複雑な状態遷移を管理するのが、Animatorコントローラー (Animator Controller) です。
Animatorコントローラーは、アニメーションクリップを「ステート(状態)」として視覚的に配置し、それらの間を「トランジション(遷移)」で結んだ**ステートマシン(状態遷移図)**を構築するための強力なツールです。2Dアニメーションでも同様の仕組みを使いますが、3D、特にHumanoidリグを持つキャラクターでは、より高度で柔軟な機能が利用できます。
この記事では、3Dキャラクターの基本的なアクション(待機、歩行、走行)をAnimatorコントローラーで管理する基本的なワークフローを解説します。
HumanoidリグとAvatarの重要性
3Dキャラクターのアニメーションについて語る上で、HumanoidリグとAvatarシステムの理解は欠かせません。モデルのインポート設定でRigタブのAnimation TypeをHumanoidに設定すると、Unityはモデルの骨格構造を標準的な人型ボーンマップにマッピングしたAvatarアセットを生成します。
このAvatarのおかげで、**全く異なるモデル間でアニメーションを再利用(リターゲティング)**することが可能になります。例えば、あるキャラクターのために作られた「歩き」アニメーションを、背丈も体型も違う別のキャラクターにそのまま適用できるのです。これは、アセットストアで購入したアニメーションを使ったり、チーム内でアニメーションを共有したりする上で非常に強力な機能です。
Animatorコントローラーの構築
Step 1: パラメー タの定義
まず、スクリプトからアニメーションの状態を制御するための「変数」となるパラメータを定義します。キャラクターの移動を例に取ると、最低でも移動速度を制御するパラメータが必要です。
- Animatorウィンドウを開き、
Parametersタブを選択します。 +ボタンをクリックし、Float型のパラメータを2つ作成します。ForwardSpeed: 前後の移動速度を表す。RightSpeed: 左右の移動速度を表す。
Step 2: Blend Treeで滑らかな移動を実現する
待機(Idle)、歩き(Walk)、走り(Run)のように、キャラクターの速度に応じてアニメーションを滑らかに変化させたい場合、ステートを個別に作ってトランジションで繋ぐのは非常に面倒です。このような連続的な変化を扱うのに最適なのがBlend Tree (ブレンドツリー) です。
- Animatorウィンドウの空いている場所で右クリックし、
Create State > From New Blend Treeを選択します。 - 作成されたBlend Treeステートをダブルクリックして、編集モードに入ります。
- Blend Treeを選択し、Inspectorで
Blend Typeを2D Freeform Cartesianに変更します。これにより、2つのパラメータ(今回はX軸にRightSpeed、Y軸にForwardSpeed)を使ってアニメーションをブレンドできるようになります。 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) アニメーション
これで、ForwardSpeedとRightSpeedのパラメータ値に応じて、これらのアニメーションが自動的に滑らかにブレンドされるようになります。例えば、ForwardSpeedが0.75なら、歩行と走行のアニメーションが半分ずつ混ざった「早歩き」のような動きが生成されます。
Step 3: レイヤーとアバターマスク
より複雑な制御のために、Animatorコントローラーはレイヤー (Layers) という機能を持っています。例えば、上半身(武器を振るなど)と下半身(歩く、走るなど)で別々のアニメーションを再生したい場合にレイヤーを使います。
Layersタブで+ボタンを押して新しいレイヤーを追加します。Weightを1に設定し、歯車アイコンからBlendingをOverride(上書き)または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を使うと、滑らかなアニメーション遷移が簡単に実装できる。 - 上半身と下半身で別のアニメーションを再生するには、
LayersとAvatar Maskを活用する。 - スクリプトから
SetFloatなどのメソッドでパラメータを更新し、アニメーションを制御する。
これらの機能を組み合わせることで、プレイヤーの操作に生き生きと反応する、説得力のあるキャラクターの動きを実現することができます。