[Unity]アニメーション関連まとめ


概要

調べてわかったことをまとめた。

例として登場するスクリーンショットは無料Assetである「3rd Person Controller + Fly Mode」から拝借させていただいている。

Animatorコンポーネント

ゲームオブジェクトにアニメーションを追加するコンポーネント。
当該コンポーネントのアタッチにあたっては、適用する「AnimatorController」を設定する必要がある。

例. 「CharacterCotroller」というAnimatorControllerが設定されているAnimatorコンポーネント

AnimatorController

複数の「アニメーションクリップ」を管理し、どの条件でどのアニメーションクリップを対象ゲームオブジェクトに対して適用するか・組み合わせるかを制御する設定ファイルである。

内容として大きくは、以下2つで構成される。

  • パラメータ定義(「状態遷移の条件」や「アニメーションのブレンドの設定」に使う)
  • ステートマシン(状態遷移)

パラメータ定義

例.

ステートマシン

別途定義しているパラメータ値に対して条件を設定し、条件を満たしたら別のステートに遷移するという形で状態遷移を定義する。

例. 「BaseLayer」のステートマシン

□がステートであり、矢印が遷移を表す。
「Entry」が指すステートはデフォルトのステート(最初の状態)である。

例. 遷移条件(Idle → Locomotion)

ステートマシン内の遷移矢印をクリックすると表示される。
この例では、以下の条件をすべて満たしたときに遷移する。

  • Speed > 0.1
  • Aim == false
  • Grounded == true

例. ステート(jump_start)

jump_startというアニメーションが設定されている。
Motion内のjump_startをクリックすると、Assetsフォルダ内のアニメーションクリップファイルを強調してくれる。アニメーションクリップファイルをダブルクリックするとそのアニメーションを開いて動作を確認することができる。

アニメーションクリップ

アニメーション自体のファイル(*.anim)。
アニメーターが作成したり、モーションキャプチャーで作成したりする。

「AnimatorController」のステートマシンにおいて各ステート単位でアニメーションクリップを設定する。各ステート単位で設定するアニメーションクリップは1つとは限らず、任意のパラメータによって「ブレンド」することができる。

アニメーションのブレンド

各ステートごとに1つだけアニメーションクリップを設定することもできるが、
「ブレンドツリー」という機能で複数のアニメーションクリップをブレンド(混ぜる)してアニメーションを表現することもできる。

ブレンドツリーでは、
「特定のパラメータ値がXのときにアニメーションクリップYの特徴が100%現れるようにする」という形で複数のアニメーションクリップとしきい値を設定する。
この設定にもとづいて、パラメータ値がしきい値に近いほどそのアニメーションクリップの特徴が現れるようになる。

例. アセット「3rdPerson+Fly」のAnimatorController「CharacterController」内のステート「Locomotion」に設定されているブレンドツリー

*_fwdがアニメーションクリップY、Speedが特定のパラメータXでThresholdがそのしきい値にあたる。
なお、 ブレンドツリーは対象のステートをダブルクリックするとインスペクタビューに表示される。

Animatorビュー

インスペクタビューでAnimatorコンポーネントのAnimatorControllerを選択すると表示されるビュー。ステートマシンなどはここで表示できる。

StateMachineBahavior

各ステートにアタッチし、そのステートの開始時・終了時・途中の毎フレームでの処理を実行させることができるスクリプトのコンポーネント。
対象のステートを選択して、「AddBehavior」でアタッチできる。

StateMachineBehaviorスクリプトのコード

public class XxxStateBehavior : StateMachineBehaviour
{

    // 当該ステート開始直後のフレームで実行
    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // 当該ステートから別のステートに遷移するフレームで実行
    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // パラメータ値は以下のような形で取得できる
        // Float型のパラメータ値の場合
        animator.GetFloat("<パラメータ名>")
        // Bool型のパラメータ値の場合
        animator.GetBool("<パラメータ名>")

        // 現在実行しているアニメーションの状態から正規化された再生時間
        // (1回の開始〜終了までの時間を「1」とする小数の相対値。
        // ループに入るごとに1が加算される)を取得する
        stateInfo.normalizedTime
    }

    // 当該ステートの開始・終了以外の各フレームで実行
    public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }
}

normalizedTimeの使い道としては、例えば移動時に足が地面に着地したタイミングで足音のSEを再生するといったことに使うことができる。

【Unity】キャラクターの移動に合わせて足音を付ける方法

参考