[Unity]アニメーション関連まとめ
概要
調べてわかったことをまとめた。
例として登場するスクリーンショットは無料Assetである「3rd Person Controller + Fly Mode」から拝借させていただいている。
Animatorコンポーネント
ゲームオブジェクトにアニメーションを追加するコンポーネント。
当該コンポーネントのアタッチにあたっては、適用する「AnimatorController」を設定する必要がある。
例. 「CharacterCotroller」というAnimatorControllerが設定されているAnimatorコンポーネント
AnimatorController
複数の「アニメーションクリップ」を管理し、どの条件でどのアニメーションクリップを対象ゲームオブジェクトに対して適用するか・組み合わせるかを制御する設定ファイルである。
内容として大きくは、以下2つで構成される。
- パラメータ定義(「状態遷移の条件」や「アニメーションのブレンドの設定」に使う)
- ステートマシン(状態遷移)
パラメータ定義
ステートマシン
別途定義しているパラメータ値に対して条件を設定し、条件を満たしたら別のステートに遷移するという形で状態遷移を定義する。
□がステートであり、矢印が遷移を表す。
「Entry」が指すステートはデフォルトのステート(最初の状態)である。
例. 遷移条件(Idle → Locomotion)
ステートマシン内の遷移矢印をクリックすると表示される。
この例では、以下の条件をすべて満たしたときに遷移する。
- Speed > 0.1
- Aim == false
- Grounded == true
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を再生するといったことに使うことができる。
参考
Author And Source
この問題について([Unity]アニメーション関連まとめ), 我々は、より多くの情報をここで見つけました https://qiita.com/WisteriaWave/items/af6a4af70512b6ce97ad著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .