Animator Controllerについてのメモ

現時点でヤギハタが何となく把握している「Animator Controller」に関する情報のメモです。


Layersに関する情報

歯車マークの横に付いてるマークでレイヤーのオプションを把握できる。

  • M – レイヤーマスクという、特定のHumanoidIKや特定のTransformのみにAnimationを適用できるようにするオプションっぽい
  • A – BlendingsがAdditiveになっている時 Additiveの仕様がいまいちよく分かっていないが、基本的にはOverrideでいいっぽい?
  • S – Syncが有効化している時 多分他のレイヤーとStateの状態を同期させるのに使う?
  • IK – IK Passが有効化している時 HumanoidボーンでIKを使う時にチェックを入れるっぽい(VRCアバターでは出番無さそう)

ここで、Weightを0にしていると、そのアニメーションでのオブジェクトの操作は反映されないから注意

(レイヤーの新規生成をすると、初期で0なので毎回変える必要がある点も注意)

Parametersに関する情報

パラメーターには、主に2種類存在する。

・定義済みパラメーター

予めVRCSDK側で定義されているパラメーターで、これから色々な情報を取得できる。

  • IsLocal – [Bool] アニメーターが実行されているアバターがローカル(自分)のものか、それとも違う(他のプレイヤー)のものか判定する。これで判定することで「他のプレイヤーからは見れないが、自分からだけ見えるカンペ」とかを取り出す機能を作れるはず。
  • Viseme – [Int(0-14)] リップシンクの状態の値が格納されている。 これを使って「開けゴマ」とかができそう?
  • GestureLeft (GestureRight) – [Int(0-7)] 左手(右手)の手の状態を取得できる。(値の詳細は下の図を参照)
  • GestureLeftWeight(GestureRightWeight) – [Float(0.0-1.0))] 左(右)のトリガーがどれぐらい引かれているかを取得できる?
  • AngularY – [Float] アバターの縦の加速度を取得できる。
  • VelocityX (VelocityY or VelocityZ) – [Float] アバターのXYZ軸の速度をm/sで取得できる。
  • Upright – [Float] どれぐらい屈んでいるかを取得できる?(1だと直立らしい)
  • Grounded – [Bool] 接地しているかを取得できる。
  • Seated – [Bool] Sitコライダーに着席しているかを取得できる。
  • AFK – [Bool] AFK状態(HMDを外しているか)を取得できる。

Gestureの値

0Neutral(手を軽く握っている状態)
1Fist(手を強く握っている状態)
2HandOpen(手を完全に広げている状態)
3FingerPoint(人差し指を立てている状態)
4Victory(ピースしている状態)
5RockNRoll(キツネサインしている状態)
6HandGun(手で鉄砲のサインをしている状態
7ThumbsUp(I’ll be backしている状態)

更にユーザー定義パラメーターというのも存在していて、アバター1つにつき16個まで定義できる。

VRCExpressionParametersファイルで定義し、AvatarDescriptorでそれを割り当てて使えるようになる。

こんなかんじ

また、裏技のようなポジションな気がするが、VRCExpressionParametersで定義していないパラメーターもAnimatorControllerのParametersにて使用できる。この際、未定義パラメーターは他のプレイヤーとは同期せずに、完全に各ユーザーで独立したパラメーターとして扱われる。

例えば、未定義パラメーターをParam1という名前で割り当てたとする。

後述する方法でControllerの中でParam1の値を10にした後、新しいプレイヤーがワールドに参加してもParam1の値は同期しない。

この時、自分上ではParam1の値は10であるが、新しいプレイヤー上では0である。

StateMachineに関する情報

StateMachineでは条件に応じてアニメーションの再生などを行えるように設定できる。

初期状態では緑色の「Entry」ステート、空色の「Any State」ステート、赤色の「Exit」ステートが存在する。

Entryステートから開始し、各矢印を通り、Exitステートに移動することで、またEntryステートに戻ることができる。

また、右クリックでステートを作ることができ、この作成したステートは灰色になる。

ただし、1番はじめに作成したステートのみオレンジ色になり、Entryから勝手にオレンジ色の矢印が生えてくる。

これは、Entryからどこにも行くところがない時に、強制的にここのステートに移るよ!というもので、Entryを右クリックしたあとに「Set StateMachine Default State」をクリックすることで、その対象ステートを変更することができる。

Exitステート以外からは、右クリックでトランジション(矢印)を伸ばすことができる。

また、Any Stateから生えているトランジションは、すべてのステートから同一のトランジションを生やしているのと同じ働きをする。

つまりこれとこれは同じである。

この場合だと、EntryからAにもBにも移動できるし、AからB、BからAにも移動できる。

また、必ずしもExitステートにトランジションを繋げる必要はない。

Stateに関する情報

Stateには様々なオプションが用意されている。

  • Motion – ここに設定したアニメーションが再生される。
  • Speed アニメーションを再生する際の速度の倍率。0にすると完全に停止させることもできる。
  • Multiplier – Parameterにチェックを入れると使える。Speedの値にパラメーター(Float)の値をかけることができる。
  • Normalized Time – Parameterにチェックを入れると使える。パラメーター(Float)の値でアニメーションの再生位置を変更させることができる。例えば、パラメーターの値が0.5だったらアニメーションの50%の位置に移動できる。 アニメーションにキーフレームを4つ配置して、Radial Puppet等でパラメーターの値を操作することで、1つのパラメーターで4つの状態を切り替えられる・・・みたいなこともできる。
  • Mirror – アニメーションのキーフレームの位置を反転させる?
  • Cycle Offset – アニメーションのLoop Timeが有効になっているときのみ効果を発揮し、指定した値からループを開始させることができる。
  • Foot IK – ごめんわからない・・・
  • Write Default – これにチェックを入れると、ステートマシン内で使われているアニメーションで弄られるオブジェクトが全て初期状態に変化した上でアニメーションを再生する。例えば、オブジェクトA(初期状態でEnabledがTrue)を弄るAClipというアニメーションと、オブジェクトB(初期状態でEnabledがFalse)を弄るBClipというアニメーションがあったとすると、AClipを再生した時にオブジェクトBのEnabledが初期状態のFalseになり、BClipを再生した時にオブジェクトAのEnabledが初期状態のTrueになる。 し か し 複数レイヤーにまたがってWrite Defaultsのチェックマークを外しているStateが存在すると、どうもバグのせいか挙動がとても不安定になるようなので、全てチェック推奨
  • Transitions – 後述します。

また、「Add Behaviour」ボタンからビヘイビアというものを追加できる。

New Scriptは使えず、既存の「VRC~・・・」系のみ使用可能

このあたりはほとんど触れてないため分かる範囲だけ・・・

・VRC Animator Tracking Control

このビヘイビアが付いているステートに入った時、各トラッキングの状態がここで設定された状態に変化する。

No Changeは変更しないという意味。TrackingにするとコントローラーやHMDに位置や回転を追従するモード(普通のモード)になる。

Animationにすると位置を追従させなくし、アニメーション等で弄れるようになる(落下モーションの手のバタバタとか確かこれ)

このビヘイビアが付いているステートに入った時、指定したパラメーターの値をValueに入力した値にすることができる。

このステートで指定できるパラメーターはAnimator Controllerで定義されていればOKで、VRCExpressionParametersでの定義は必須ではない。

ただし、未定義パラメーターの場合は他のプレイヤーとは同期しない、完全にローカルな値の変化になる。(定義済みパラメーターだと同期する)

Transitionsに関する情報

Transitionsは、とあるステートから別のステートに移る条件やタイミングなどを指定できる。

Transitonsには複数の条件を登録できる。例えば、トランジション1とトランジション2を登録すると、トランジション1の条件がOKならトランジション1で指定されているステートに移動して、NGだったらトランジション2の条件を確認。それがOKならそっちに飛んで、NGだったら何もしない。みたいなことができる。

また、Conditionsには条件を指定でき、パラメーターの値が1だったらとか、0.5未満だったら、みたいなことを指定できる。

ここで複数指定した場合は、すべての条件が満たされた場合のみトランジションが発生する。

Has Exit Timeにチェックを入れると、Exit Timeの値を変更できるようになり、アニメーションがExit Timeで指定した値まで再生されたら強制的にトランジションを開始できるようになる。

このとき、Exit Timeの値は0.0から1.0正規化された値であり、例えば0.4だったら40%の位置まで再生したらトランジション開始、1だったら最後まで・・・のようになる。1より大きい数も入力でき、例えば2.1と入力すると210%(2回ループして10%再生した後)にトランジションが起こるらしい。(情報提供ありがとうございます。)

逆に、Has Exit Timeにチェックを入れないことで、再生が終了しても条件が満たされるまではトランジションが行われないようにすることもできる。

このとき、Conditionsに何も設定していないと、そのトランジションは動かなくなるので注意。

Transition Durationにはトランジションに費やす時間を設定でき、Fixed Durationにチェックを入れている場合は秒数、入れていない場合は正規化された時間で指定することができる。

例えば、Fixed Durationにチェックを入れた状態でTransition Durationを0.5とすると、0.5秒かけて徐々にトランジション先へ移動することができる。

Transition Offsetに値を指定すると、その指定された値からトランジション先のアニメーションの再生が始まる。

Ordered InterruptionとBlendTree Parametersはイマイチよく分かっていないためとりあえず今は割愛・・・