はじめに
今回はUnityにあるアニメーションコントローラーの使い方をまとめます。

私はVRChatを動かすためにUnityを使ってます。
そのため情報がVRChat向けに偏ってます。
ゲーム開発用途に関しての説明は弱いのでご了承ください。
筆者はゲーム用途でのUnity利用は未経験です。
アニメーションコントローラーの基本操作
プロジェクトを右クリック。
作成 → アニメーションコントローラーを作成。

名前はF2キーで変更可能。
生成されたアニメーションコントローラをダブルクリック。

するとアニメーターが表示されます。
・中クリックで表示位置を移動。
・マウス中ホイール操作でズームイン/アウト。
・クリック → マウス移動で中にある項目(ステート)の配置を操作

以上がアニメーションコントローラーの基本操作です。
基本ステートについて
Entryがステートの開始地点です。
そしてExitに信号が行ったらEntryに戻ります。

Any Stateは「条件さえそろえば “どの位置に居ても” 無条件で実行」する処理です。

Entry → New Stateに居ても、Any Stateから遷移する条件が入ればその先のステートに動きます。
詳しいステートの操作はあとで紹介します。

これを使うことで複雑で手間な配線を簡略化できることがあります。
(上級者向け)

Any Stateはどの位置からでも遷移します。
なのでAny Stateの遷移先に居ても条件が満たされてれば再度遷移します。
その結果、遷移中の動きが無限に循環して意図しない挙動になることがあります。

なのでAny State使用時は「自身に遷移」を無効化することをおすすめします。

そして「Any State、Entry、Exit」はそれ自体にアニメーション情報を乗せれません。
“制御点” があるだけです。

アニメーション情報の受け皿は右クリック → ステートの作成 → 「空」で行います。
1つ目のステートは自動でEntryにつながります。

2つ目以降のステートはどこにも刺さりません。
あとで手動で配線する必要があります。

Entryからの遷移先は黄色い表示はEntryを右クリック。
「ステートmachineのデフォルトステートを設定する」で変えれます。

何もないところを右クリック。
「サブステートマシンを作成マシン」を押すとステートのフォルダー的なモノが作れます。


グループ化、階層分け、処理を見やすくするための機能です。
次はこの「サブステートマシン」を見ていきます。
サブステートマシンについて(グループ化)
サブステートマシンはステートのグループ化のような機能です。
ダブルクリックで中の階層に入れます。

中にはこれまでと同じく基本的なステートがあります。(Any、Entry、Exit)
そして、サブステートマシンから出るためステートが用意されてます。

処理に関しては下図の通り。
・Any Stateは共通(サブステートマシンの中でも無条件で信号があれば実行)
・Entryはサブステートマシン内でのスタート地点
・Exitはサブステートマシンの中でEntryに戻る
・(UP)はサブステートマシンの上階層に戻る(出力配線が対応)

以上がサブステートマシンの解説です。
レイヤーについて(並列処理)
レイヤーは並列処理される別の回路です。
「レイヤー」の状態で「+」ボタンを押せば追加できます。

こんな感じで別の回路を生成できます。

2つ目以降のレイヤーは「ウエイト」を1にしてください。
このウエイトは合成の影響度です。(1=100%)

ウエイトを1にすることで100%の影響度を持って一番上のレイヤーに合成できます。

ちなみに一番上のレイヤーは初期状態でウエイトが1になってます。

合成方法を表すブレンドは下記の2種類から設定可能。
・オーバーライド = 上のレイヤーと同じ部位を操作する処理があれば上書きする
・Additive = 上のレイヤーと同じ部位を操作する処理するがあれば変化量を足し算して合成

あとはヒューマノイドボーンのアニメーションであれば…
アバターマスクを読み込んで特定のパーツだけ動作しない設定もできます。

IKは特定のオプジェクトなどに合わせてヒューマノイドボーンの形を操作する項目です。
ゲームのドアノブを持つ動きなどに使えます。

「同期、タイミング、ソースの層」は他のレイヤーとアニメーション再生を合わせる処理です。


上半身と下半身の条件分岐を分けて一緒に制御するときに使えます。
たとえば立としゃがみ状態で銃を持った動きを作ったり…?
このあたりは本格的なゲーム開発者向けの設定です。
VRChatユーザーの方はあまり触らないです。(正直分からなかった)
↓こちらの記事の方などが詳しく解説してます。

以上がレイヤーについての解説です。
遷移とパラメーターについて(条件分岐)
初期状態ではEntryからオレンジ色の線が最初に作ったステートに伸びてます。

この線はEntryを右クリック
「ステートマシーンのデフォルトステートを設定する」で変更可能。


Entryにアニメーション情報は入れれません。
なのでオレンジ色で表示されたステートが一番最初の状態を記録したアニメーションを再生する場所になります。
Entryの続きはステートを右クリック。
遷移を作成を選択。

遷移を作成を使うことで様々なステートへの移動回路を組めます。

Entryから出るオレンジの線は無条件で実行されます。
それ以外の白い線は自分で条件を指定しないとそのステートへ動きません。

ステート以上の条件は “線” をクリックで選択。
インスペクターを確認。
Conditionsの所で「+」を押すと指定できます。

画面左上でパラメーターを表示。
ここで条件を指定するためのパラメーターを追加。


VRChatユーザーの方は「Expressions Menu」などを使うことで操作できます。
Unity単体での操作は… 知らないです。
ごめんなさい。(ゲーム用途で使ったことない)
パラメーターを追加すると、そのパラメーターを使った条件分岐を作れます。
↓この図はNew Boolが「Ture(1,有効)」なら遷移を実行という意味になります。

どのような条件にできるかは指定したパラメーターで変わります。

◆Float
→ Greater:入力が指定した数値より大きいか
→ less:入力が指定した数値より大きいか
◆Int
→ Greater:入力が指定した数値より大きいか
→ less:入力が指定した数値より大きいか
→ Equal:入力が指定した数値と等しいか
→ Not Equal:入力が指定した数値と等しくないか
◆Bool
→ 入力がTure(有効)か
→ 入力がFalse(無効)か
◆Trigger
→ 指定なし(信号が来たら実行)
次も同じように配線を行い条件を指定。
Exitに対し配線をしたので…
「New Bool」が「false」ならEntry経由で元のステートに戻る処理になりました。

この場合「New State」と「New State 0」を交互につないでも大丈夫です。
↓この図は同じ処理になります。

白い線は選択 → Deleteキーで削除できます。
今のうちに消したり、繋ぎなおしたりして操作に慣れましょう。

次はステートとステート間の切り替わり方を見ていきます。
切り替え時の挙動(トランジション)
線を選択 → インスペクターを確認。
「終了時間あり+Settings」の所で遷移の挙動を調整できます。

重要なポイントは下記の2つ。
◆終了時間
→ 条件が入力されてからアニメーションが終了するまでの時間を遅らせる
◆遷移時間
→ 終了時間が終わった後で遷移に使う時間
(グラデーション的に2のアニメーションが切り替わる)

遷移の挙動は関わるステート全てにアニメーションを入れると確認できます。
プロジェクトの何もないところを右クリック。
作成 → アニメーションを選択。

空白でいいのでアニメーションを入れて確認。

アニメーションを入れると遷移のプレビューが表示されます。
そして上部のパラメーターでいろいろ操作できます。
【遷移にかかわるパラメーター】
◆終了時間あり
→ 終了時間を有効化する(なしだと即時に遷移時間へ)
◆終了時間
→ 条件分岐の信号が来てから切り替え開始までの遅延時間
→ ディレイタイム
◆遷移間隔
→ 終了時間後に行われるアニメーションの切り替え時間
→ 0.5秒などに設定するとグラデーション的にアニメーションが切り替わる
◆遷移オフセット
→ 遷移時間の開始地点をズラす
→ 終了時間を削れる
→ マイナス方向の値は設定できない(遷移間隔は削れない)
→ (終了時間を調整すればいいと思われる)

プレビューのグラフは操作できます。


プレビュー画面で操作して、値を綺麗にするために手入力で調整がおすすめ。
固定間隔を無効化すると単位が「秒」から「%」になります。

「中断要因」と「順序づけられた割込み」は遷移中に別の遷移への条件分岐が有効化された時の挙動調整です。
割込みは「5つ」のパターンが用意されてます。

↓この部分に影響を出します

このあたりはゲーム開発者向けの設定。(そして上級者向け)
VRChatユーザーの方はそこまで気にしなくて良いです。
【中断要因の割り込みパターン】
◆なし (None)
→ 割込み禁止
→ 遷移が終わるまで遷移しない
//ーーー
◆Current State
→「今のステート」からの別の遷移なら割り込み可能
→ 今のステートとつながってないモノは割り込み不可
〇「Idle」→「Walk」の途中で「Idle」→「Jump」
×「Idle」→「Walk」の途中で「Walk」→「Attack」
//ーーー
◆Next State
→ 「次のステート(遷移先)」からの遷移なら割り込み可能
〇「Idle」→「Walk」の途中で「Idle」→「Jump」
×「Idle」→「Walk」の途中で「Idle」→「Jump」
//ーーー
◆Current State Then Next State
→「今のステート」+「次のステートから」両方で割り込み可能
→ 両方同時の時は「今のステートからの割り込み」が優先される
〇「Idle」→「Walk」の途中で「Idle」→「Jump」
〇「Idle」→「Walk」の途中で「Walk」→「Run」
×「Idle」→「Walk」の途中で「Attack」→「Jump」
(つながってないため不可)
//ーーー
◆Next State Then Current State
→「今のステート」+「次のステートから」両方で割り込み可能
→ 両方同時の時は「次のステートからの割り込み」が優先される
〇「Idle」→「Walk」の途中で「Idle」→「Jump」
〇「Idle」→「Walk」の途中で「Walk」→「Run」
×「Idle」→「Walk」の途中で「Attack」→「Jump」
(つながってないため不可)
//ーーーーーーーー
【順序付けられた割り込み】
→ ステート中に割り込み処理発生時、チェックを入れたものを優先して処理する
順序付けられた割り込みはオン/オフしかできません。
細かな割りみの順位付けは下記のようになります。
【割り込み条件が同時に満たされた時の順位付け】
① 順序付けられた割り込みあり + Transitions上で上の方にあるもの
② 順序付けられた割り込みあり + Transitions下で上の方にあるもの
③ 順序付けられた割り込みなし + Transitions上で上の方にあるもの
④ 順序付けられた割り込みなし + Transitions下で上の方にあるもの
基本的にTransitionsの上から順に実行されると考えてください。
その上で「順位付けられた割込み」を入れるとこの条件を覆します。


管理がややこしくなりそうなのでオンかオフで統一。
上下順を手動で動かして調整するのがおすすめ。
「=」の所をクリック → マウス移動で位置は調整できます。
(たぶんデバッグして挙動を見ながら調整する場所)
以上が切り替え時の挙動です。
2つ以上の条件指定(ANDとOR)
プログラムなどの条件分岐は「2つ以上の条件」を設定できます。

一般的に使われる複数の条件分岐指定は「AND」と「OR」です。
プログラムの世界ではANDは&&。
ORは || で表現されたりします。
【2つ以上の条件分岐】
・AND → 2つ以上の条件が両方有効なら実行
・OR → 2つ以上の条件のうちいずれか1つが有効なら実行
ANDは2つの条件が有効な時だけ実行されます。
直列でつなぐイメージ。

いずれか1方が有効が無効だと実行されません。

ORはいずれか1つが有効なら実行されます。
並列でつなぐイメージ。

もちろん2つとも有効でも実行されます。


他にもNAND(2個揃った時だけ無効)や…
XOR(両方が揃ってない、両方が揃うときに無効)などありますが…。
このあたりはアニメーションコントローラーの配線で表現不可です。
パラメーター入力の条件分岐などを調整して表現してください。
(Int入力時の “Not Equal” を組み合わせて使うなど)
アニメーションコントローラーの場合…
AND回路は「Conditions」を+ボタンで追加すれば作れます。

OR回路は線が「3つの三角」になった状態にすれば作れます。

3つの三角はすでに配線したステートを右クリック。
遷移を作成 → 同じステートに被せれば作れます。

↓こちらの.gifような操作方法です。

配線を選択。
インスペクターの「Transitions」をクリックすると条件分岐を個別に設定できます。

「Transitions」にある条件分岐は同じ移動先でも別物という扱いになります。

以上が2つ以上の条件指定の方法です。
その他の遷移設定
Transitionsは「Solo」と「Mute」の設定ができます。
これは基本的にOR回路作成時のデバッグに有効です。
・Solo → 指定した条件分岐の時だけしか動作しないようにする
・Mute → 指定した条件分岐の動作を無効化する
SoroとMute表示を行うと “三角” の色が変わります。

Transitionsは選択 → 下の空白で名前変更も可能。
ただ分かりにくいのでそのままでもOK。

制作したTransitionsは選択 → 「-」ボタンで消せます。
すべて消すと配線なしの状態になります。

ステート選択時にもTransitionsは出てきます。
こちらを選択するとステート遷移の挙動を調整できます。


慣れるとこの表示がすごく便利。
ステート選択時のTransitions表示はつながってる全てのモノが表示されます。

以上がそのほかの遷移設定です。
「動作を追加」について
ステートを選択すると「動作を追加」を設定できます。
VRChatであれば下記のようなモノが追加できます。
主な追加動作(Chat GPTまとめ)
ModularAvatarMMDLayerControl
→ Modular AvatarでMMD用のレイヤーを制御。
VRCAnimatorLayerControl
→ VRChat用。Animatorの別レイヤーを有効/無効にする。
VRCAnimatorLocomotionControl
→ Locomotion(移動アニメーション)をON/OFF。
VRCAnimatorPlayAudio
→ アニメーション再生中に音を鳴らす。
VRCAnimatorTemporaryPoseSpace
→ アバターのポーズ空間を一時変更。
VRCAnimatorTrackingControl
→ IKトラッキングを制御。
VRCAvatarParameterDriver
→ VRChatパラメータを操作。
VRCPlayableLayerControl
→ Playable Layerの切り替え。
これは設定したすべての配線、Transithinsに対して共通で同じ効果を出します。
(個別設定不可)

主に使うのは「VRC Animator Play Audio」と思います。
これを使えばギミックに音を入れれます。
Source Pathを使えばヒエラルキーのパス指定で音源を読み込み可能。

こちらの水鉄砲はこの仕組みで音を鳴らしてます。


以上が動作の追加についての解説です。
ステート内でのアニメーション設定
ステートをクリックするとアニメーション設定の関する様々な項目が出てきます。

主な必須設定項目は下記の2つ。
【Motion】
→ 「アニメーション」もしくは「Blend Tree」の受け皿
→ Blend Treeを入れると複数アニメーションをパラメーターで制御できる
【Write Defaults】
→ オンだとアニメーション切り替え時に一部のパラメーターが初期化されたりする
→ オフだと切り替え時の初期化が起こらない
→ VRChatではWrite Defaultsは「オフ」が推奨されている

右側に「パラメーター」があるものはパラメーター入力で挙動を変えれます。
◆速度×乗数
→ アニメーションの再生速度(1で等速)
◆Motion Time
→ アニメーションのうちどのフレームを表示するか
→ パラメーターを入れると時間経過でアニメーションが再生されなくなる
→ パラメーターで1~100を入れるとその入力に合わせて1~100フレームが表示されたりする
◆Mirror
→ アニメーションの左右反転
→ ヒューマノイドボーンのアニメーション向け
◆Cycles Offset
→ アニメーションの開始フレームをズラす

Foot ILは足ボーン位置を元に膝ボーンの挙動などを調整するか?です。
ゲーム制作向け機能。
地面の設置などを扱う際に役立ちます。

以上がステート内でのアニメーション設定です。
Blend Treeについて
Blend Treeを使うと複数のアニメーション情報を1つにまとめて入力できます。
そしてBlend Treeにパラメーターを送り複数のアニメーションを操作できます。
↓こちらが一般的な上下左右+中央の操作例

ジョイステックなどの操作を設定するのに役立ちます。

これをMotionsに読み込むことでいろいろできます。

ブレンドツリーはプロジェクトを右クリック。
作成 → Blend Treeで作れます。

もしくはステートを右クリック。
「ステートに新しいブレンドツリーを作成」でも作れます。
ただし…

「ステートに新しいブレンドツリーを作成」で作ったBlend Treeはアニメーションコントローラーの”中に”データが生成されます。
つまりアニコン内蔵状態になり、アニコンを消すとBlend Treeデータも消えます。
不便なのでアニコン内での作成はおすすめしません。

Blend Treeの使い方概要
※こちらの記事からBlend Treeに関する部分だけを抜き出し+改変して紹介します。
VRChatユーザーの方はこちらを見た方が良いです。
プロジェクトにあるBlendTreeを選択。

インスペクターを開きタイプを「2D Freefom Directional」などに設定。
入力するパラメーターを「横」 → 「縦」の順に登録。

ブレンドタイプはジョイステックで動かすなら「2D」系を使います。
選択を変えると中にあるモーションの動き方が少し変わります。

細かいことを言うならば…
・2D Simple Directional → 4か8方向設定の時綺麗
・2D Freeform Directional → 4か8方向設定以外でもきれい
・2D Freeform Cartesian → XとY方向の操作が独立した別物の時向け(扱いづらい)

補間方法の違いが問題になってるだけです。
特にこだわりがなければ…
4と8方向もきれいに出せる「2D Freefom Directional」でOK。
詳細は公式マニュアルをご覧ください。
1Dと直接は2つのアニメーション間での操作です。
使う機会がある方は使いましょう。

アニメーションの追加はMotionの「+」ボタンを選択。
モーションフィールドを追加を選択。

生成された枠にアニメーションを入れると動くようになります。

New Blend Treeを押すと自Blend Treeが入れ子になります。
使い道は謎。

あまり使わないのと…
空白で作ってもあとからBlendTreeは登録可能です。
なので最初は「モーションフィールドを追加」で足すのがおすすめ。

そしたら2つ目のアニメーション枠を追加。
するとBlend Treeのグラフが表示されます。

このグラフの上下が2Axisの入力に対応してます。

そして小さな点がアニメーション入れる場所です。
ここにアニメーションを登録することで間を綺麗につなげれます。

アニメーションの位置は「Pos X」と「Pos Y」で設定できます。
こちらは数値入力が可能。

「+」を連打で追加していくと円形に配置されます。
斜め45度の位置は「0.71、0.71」です。

この「0.71、0.71」位置は2Axisの入力に対応してます。

「X=-1、X=-0.5、x=0」とすると間に変化情報を作れます。

Pos X/Yは四則演算の入力が可能です。
・足し算 → +
・割り算 → -
・掛け算 → *
・引き算 → /
斜めにある0.71のような数値は少し計算で出しにくいです。
なので数値の横に「/2」を入れるとすぐに半分の位置を設定できます。

制御点をクリック → マウスを移動でも操作できます。
ただし値が1を超えて配置が綺麗にならないのでおすすめはしません。

グラフ上にある「赤い丸」は2Axisのプレビューです。
Blend Tree上で「どのアニメーションがどれぐらい有効になるか」が確認できます。

・時計マークはアニメーションの再生速度。
・一番右の人型はアニメーションの左右反転。(基本は人型ボーンのみで利用可能)
・下の操作項目は位置やアニメーションの自動調整系のモノです。(使わなくてOK)

そしたらアニメーションと位置を下記のように設定。
1 → X= 0:Y= 0
2 → X=-1:Y= 0
3 → X= 0:Y= 1
4 → X= 1:Y= 0
5 → X= 0:Y=-1

したらBlend Treeに入れるアニメーションを作ります。
プロジェクトを右クリック → 作成 → アニメーションを作成。

今回は5個刺すところを作りました。
なのでアニメーションを選択 → Ctrl+Dキーで5つ複製します。

作成したアニメーションをBlend Treeに刺します。

これにアニメーションを設定。
パラメーター入力を実行。

すると変形したり…
他にもいろいろできます。

以上がBlendTreeで複数の使い方概要です。
まとめ
今回はUnityにあるアニメーションコントローラーの使い方をまとめました。
・ステートはEnterから始まる
・New Stateでステートを作成するとアニメーションを入れれる
・2つ以上のステートは右クリック → 遷移を設定で切り替わりの条件分岐を設定可能
・条件分岐は生成した線を選択 → インスペクターのConditionsで行う
・条件分岐を作るためにアニメーションコントローラー内でパラメーター設定が必要
・ANDの条件分岐はConditionsを複数追加で行う
・ORの条件分岐はステートの配線を2重以上に重ねて行う
また他にもUnityやVRChatについて解説してます。
ぜひ、こちらをご覧ください。
コメント