Avatar3.0の仕組み解説

VRChatのAvatar3.0の、主にエンジニア向けの、仕組みから理解したい人むけ解説。OSCも来たからついでに*1

公式ドキュメントはここ。できるだけ間違いがないよう書いているつもりだが、ミスっていたら教えて欲しい

Avatar2.0時代

Unityで3Dモデルを動かすにはAnimatorとAnimationを使うのが良い、というセオリーに則り、アバターには決め打ちの固定のAnimatorが入っていて、それでもって表情やらEmoteやらGesture(ハンドサイン)やらを出していた。

ユーザーの自由度としては、AnimatorにセットするAnimationのみを編集できる。ので、自由度としては限界が出てくる。

例えば

  • 目パチを制御する方法がない
  • アイテムの出し入れが出来ない
  • それらの状態を同期したり/保存する方法がない
  • Gesture/Emoteより複雑な制御ができない

といった問題、拡張性の乏しさが目につくようになった。*2

という所で、出てきたのがAvatar3.0だったわけです。*3

Avatar3.0の基本思想

ということで、Avatar3.0の思想はこれらの問題点、制限を減らすことを意識して設計されているようだ。

f:id:o_mega:20220220225047p:plain

具体的に一番大きいのは、アバターのAnimatorが編集可能になったこと。これにより、複雑な制御が自由に作れるようになる。UnityのAnimator標準機能でAnimationを合成したり条件分岐してAnimationを再生すれば良い。

次にExpressionParameter。これは前述の同期できない問題に対する回答。基本的にはParameter変数を入れておく場所。同期して欲しいパラメーターをここに書くと、すべてのクライアントに同期され、前述のAnimatorを動かす。ついでにローカル保存もできる。OSCで入出力できるのもここ。*4

最後はExpressionMenuだ。ExpressionMenuはExpressionParameterをVRChat内から編集する手段だ。オンオフが設定できるToggle、0~1の無段階スライダ(Radial)、2軸4軸のPuppet、多段メニューを実現するSubmenuなどが設定できる。

 

基本的にはこの3つを把握していれば良い、はずだ。*5

AnimatorとPlayableLayer

公式ドキュメントはここ

まずちょっとややこしいのだが、UnityのAnimatorのLayerと、Avatar3.0のPlayableLayerは別モノなので注意。

f:id:o_mega:20220220204637p:plain

UnityのAnimatorにあるLayer

f:id:o_mega:20220220204745p:plain

Avatar3.0のAvatarDescriptorにあるPlayableLayerの設定(実体はAnimator)

全部乗せのAnimatorを編集するのは大変だから?かAnimatorを分割し、用途と挙動別に5レイヤーに分けている。Base、Addictive、Action、Gesture、FX。

ボーンを動かす(無理やりポーズを変えるような)アニメについては、ヒューマノイドボーン(腕とか足とか)と非ヒューマノイドボーン(ケモ耳とかしっぽとか)でまた扱いが異なる

  • Base、基本的な挙動を入れる所。AFKとか椅子へ座るとか
  • Addictive、Baseに常時"加算で"追加される。ヒューマノイドボーンを動かしたいときに使うレイヤー。具体例としては呼吸で胸が上下するアニメ等。
  • Gesture、非ヒューマノイドのボーンを動かす時に使うレイヤー。transformのみ有効。具体例としてはケモ耳やしっぽを動かす等。
  • Action、発動時に"Overwrite"が強制されるレイヤー。Avatar2.0時代のEmoteアニメ、プレーヤートラッキングを無視して動くダンスとかを入れる用途
  • FX、その他を入れるレイヤー。重要。表情ブレンドシェイプはここ

と別れてる。

よくVRChatterがやりたい、「ジェスチャーで表情を変えたい」「アイテムの出し入れをしたい」であれば全部FXレイヤーに入れる、で良い。

f:id:o_mega:20220220200744p:plain

こんなの編集したくねえ筆頭のBaseLayerのテンプレート遷移図

そして、それらAnimatorのテンプレートは全部SDK3に最初から用意されている。

f:id:o_mega:20220220210634p:plain

VRCSDK3>Example3>Animation>Controllersにテンプレが入ってるのでコピペして使おう

また編集不要なレイヤーについては最初の画面のようにDefaultのままで良い。特にBaseなんかはAFKアニメを差し替えたい、ぐらいしか要望はないと思われる。普通触らなくて良し、AFKを差し替える場合でも用意されてるテンプレートをコピーして差し替えるのがいいだろう。

 

FXレイヤーを作る場合、ジェスチャー分岐遷移図が書かれているvrc_AvatarV3HandsLayerをコピってやる

f:id:o_mega:20220220211203p:plain

vrc_AvatarV3HandsLayerには両手ジェスチャーに応じてアニメを再生するシンプルな遷移図が用意されている

あとはここの各ステートに、SDK2の時同様の表情Animationを作って設定すれば良い。出来たFXレイヤーをVRC AvatarDescriptorのPlayableLayer-FXLayerにセットすれば、基本的には完成だ。

表情アニメの作成はUnityEditor手打ちでもいいが、自分はがとーしょこらさん作のVRCAvatarEditor betaを使っている。さっくりblendshapeで表情パターン作るのが早い

前の記事にも書いたが、このままだと表情がIdleにもどり切らなかったので表情を戻すアニメを作り、FXレイヤーの一番上に加えている(Idle上書きアニメの設定)(参考記事・Avatars3.0で表情が戻らない現象の直し方 決定版 - プラナリアのメモ)

f:id:o_mega:20220221002556p:plain

defaultにはすべての表情blendshapeを0にするAnimation(Idle上書き)が入ってる

 

アイテムの出し入れや、着せ替え等より複雑なことをしたい場合、作ったFXレイヤーに手を加える。Parameterをアイテムのオンオフ値なりを追加して、そのオンオフ値を見てアイテム出現/消失アニメを設定するという形になる

f:id:o_mega:20220220212235p:plain

AnimatorのParametersはここにある

アバターの挙動のややこしさを全部Animatorにぶつけ、それをある程度切り分けつつもユーザー編集可能にする、がAvatar3.0の基本設計思想と思われるので、UnityのAnimatorを理解するのがAvatar3.0を理解する一番のキモだと個人的には思う*6

VRC組み込みで存在するAnimatorParameter

公式ドキュメントはここ

Parameterの中にはExpressionParameterに書かなくても使えるパラメータがある。これはVRChatシステム側が提供してくれるパラメータで、例えばプレーヤーがコントローラやキーボードから行うジェスチャ操作などがそれに当たる。移動やプレーヤーがVRモードで遊んでいるか、3点トラッキングか4点かフルトラか、ジャンプ状態か、など色々な状態が取れる。

Animatorプラスアルファ

以上のAnimatorの機能でだいたい機能は足りるのだが、それだけでは実現できないものがちょっとある。それらを補助するのが以下のコンポーネント群で、これはAnimatorStateに追加する形で使う

その一つが、特定Animation中だけ目パチを止めたり、口パクを止めたりといったもので、これはVRCAnimatorTrackingControlからできる。

f:id:o_mega:20220220224315p:plain

VRCAnimatorTrackingControlはAnimatorのステートからAdd Behaivourする

前記事でも書いたが、Trackingにするとトラッキング(口パク等)かVRCシステム(目パチ)を優先、AnimationにするとAnimationで定義された動きを優先するようになる。口を閉じたアニメや、目を閉じたアニメではそれぞれAnimationを選択しておくと良い

公式ドキュメントはここ(の一部)

ExpressionParameter 

上で作成したFXレイヤーAnimatorにはカスタムすればいろんなParameterが追加されているはずだ。これを同期して、他のプレーヤーにも見えるようにするのが、ExpressionParameter

f:id:o_mega:20220220213750p:plain

プロジェクトウィンドウを右クリックして新規作成できる

といってもそんな複雑なことはなく、FXレイヤーに作ったParameterの名前とtypeを書き並べればOk。savedにチェックをつければワールド移動やVRChatを再起動しても残る。

f:id:o_mega:20220220214153p:plain

Add/DeleteとかUI違うと一瞬ビビるよね?

ちなみにOSC経由で操作できるパラメータもコレ

ExpressionMenu

公式ドキュメントはここ

上で作成したExpressionParameterをVRC内から変更する方法。

新規作成する方法はExpressionParameterと同じ。あんまり複雑ではないのでポチポチ触ってみるのが早いと思われる。メニューにControlsを追加ボタンやらラジアルを設定し、上のExpressionParameterのどの値を操作するかを設定する

f:id:o_mega:20220220215318p:plain

UIを選んで、対応するExpressionParameterの名前と型を書いていく

まとめ

とにかく重要なのがAnimatorの理解、特にFXレイヤーを作れるかどうかがキモ。とはいえ、普通に使う分、SDK2相当のセットアップにはSDK内のvrc_AvatarV3HandLayerのコピペでよい。先を作ってみたくなったら、その改造から始めるのが良いと思う。

最初にFXレイヤーを設定できれば、後は、そこで使うParamatersをExpressionParameterに列挙し、ExpressionMenuにUIを並べて同様にParameter名を並べればだいたい*7作れると思う

  1. AvatarDescriptorを付けた+ViewPoint設定しただけのアバター
  2. そこにvrc_AvatarV3HandsLayerをコピって、FXレイヤーに設定する。それぞれのジェスチャーに顔アニメを設定、Idle表情を上書きするAnimationLayerを追加する

というのを実際に手順にしたのが下の記事なわけです

VRChatアバター3.0を雑セットアップするオレオレワークフロー2022版最新版 - おめが?日記_(2)

*1:betaに来た

*2:目パチ制御については元怒さん作のNoBlinkSetter(公開終了につきケーキさんのガイド記事をリンクしています)、Emoteを使ってたInventryシステムなどが過去あった。が、いづれもAnimatorを多段で重ねた際に動くトリッキーな仕様に基づくもので、黒魔術的です。

*3:ただ、この2020/8の紹介記事で書かれているように、3.0でやろうとしていることの一部しか実装されていない。OSCとSoon™のPhysicsBone含めてもまだ追加が予定されている?ようだ

*4:これは推測だが、今後予定されてるアバターコライダーも判定が情報がここに飛んできそう?

*5:はずだ。というのはVRC公式ドキュメントにあるように幾つかすでに知られたバグがあったり、UnityAnimatorコンポーネントの怪しい挙動などはそれはそれとしてあるため、バッドノウハウが不要になったわけではない。適時聞いてググって調べる必要はまだまだある

*6:が、公式ドキュメントにも度々書いてあるやんけ

*7:表情が戻らないとかの怪しい挙動を除けば