壁ツェーン

オンギャーの思考回路

VRChat の Avatars 3.0 の簡単な解説・表情の入れ方

(テンションがいつもと違う可能性があります)

Avatars 3.0 がついに正式リリースでも使えるようになりましたね! 既存の多くのプラグインが使えなくなったりして大変ですが、ひととおり表情操作を実装できたので、 ちょっと記事にしてみようと思います。

ひょっとしたら表情以外を作る方法も書くかも。

更新履歴

  • 2020-11-22 17:28:07 追記: レイヤーを埋めることの重要性、Write Defaults について追記。
  • 2020-8-11 22:14 追記: 表情干渉防止、Non-humanoid リグについてなど追記。
  • 2020-8-8 11:31 追記: Toggle について修正。

Avatars 3.0 の各種要素の解説

概要としては以下の記事を読んでもらうのが一番なんですが、ここから辿ってもあまり詳しい情報には辿りつけないですね。これから整備されるという感じっぽいですが……

docs.vrchat.com

というわけで、僕なりに公式ドキュメントや Walkthrough を読んで翻訳・注釈したものを以下に書いていこうと思います。 以下で説明される概念は、ほぼ全て従来のアバターにはなかったものになります。Avatars 3.0 は AV3、従来のアバターは AV2 と表記。

Playable Layers

アバター上のアニメーション合成に関わる部分です。以下に示す 5 つの Playable Layer というものが定義されており、ユーザーはそれぞれを独自の Animation Controller で上書きすることができます(指定しないものは全てデフォルトのものが使用されます)。そういえば性別の指定がなくなりましたね。

Base Layer

歩行やジャンプ、這行などの移動を司るグループです。以下に示すように、複雑なステートマシンを構成することが多くなります。 そのため、普通の人型のアバターを扱う分にはアニメーションを差し替える程度の改変で問題ないと思われます。

f:id:kb10uy:20200807234933p:plain
Base Layer のサンプル

Additive Layer

Base Layer に名前通り「加算」されるグループです。紹介されている例では呼吸などのアニメーションをここに割り当てることを想定しているようです。

ここで注意として、尻尾やけもみみなどのアニメーションは Additive ではなく後述の Gesture に追加しなければなりません。 Additive Layer はあくまで Humanoid リグで対応付けるボーンに限定して加算されるものということのようです。

Gesture Layer

ハンドサインなど、身体の他の部分と独立して動作する必要のあるアニメーションを司るグループです。手に限らず、身体のどこでも動かすことができます。 Humanoid リグに含まれないボーンのアイドルアニメーションなどもここに入れましょう。

なお、表情などの BlendShape (シェイプキー) によるアニメーションはここに入れてはいけません。後述の FX に追加しなければなりません。

Action Layer

AV2 における Emotes です。 要はワンショット再生のモーションを再生するためのグループです。 デフォルトでウェイトが 0 に設定されているので再生するためにはアニメーションステートにビヘイビアを追加する必要があります。

ところで、SDK 付属の Action Layer 用の Animator Controller を見るとわかるのですが、 Die のアニメーションに起き上がる 動作が追加されています。

FX Layer

技術的には「Transform 以外のアニメーション」を司るグループです。要はボーンのアニメーション以外は全部ここに放り込む。 というのも、他のレイヤーからは Transform しかコピーされないため、鏡に写った際に実際の状態と異なる表示になってしまうからだそうで。

  • シェイプキー
  • マテリアル・シェーダーアニメーション
  • GameObject やコンポーネントの切り替え
  • Particle System のアニメーション

……は、 FX に追加する必要があります。

補足1: Non-humanoid Rig について

以前から Generic リグでアバターを作成することは可能でしたが、その場合 VRChat 標準のアニメーションセットはおろか Animator Controller Override まで使えなくなってしまっていたため、 Final IK (高い)などを利用して IK を手動でセットアップしたり、Unity 側で挿入されるアニメーターで固定アニメーションしか表示できないという状態が続いていました。

AV3 では、 IK はともかくアニメーションについては以下で説明する Animator Parameters を参照できるようになったことで、Humanoid 以外でもプレイヤーの動きに合わせてアニメーションを変化させることができるようになりました。 (具体的には自分の田植え機アバターの車輪が回るようになったり、ダストブロワーの噴射口のチューブを自由に曲げられるようになった)

で、VRC Avatar Descriptor を Non-humanoid Rig なアバターにアタッチした場合の挙動ですが、 Playable Layers が Base, Actions, FX だけになります。それ以外は Humanoid の場合と同じようです。 つまり、Non-humanoid の場合は呼吸や尻尾などの動きについても Base Layer の Animator Controller に配置することになります。

補足2: Playable Layers をカスタマイズする場合

2020/10/28 付近のアップデート以降、一部のアニメーションがうまく動作しないという問題が発生するようになりました。

これについては、 「カスタマイズしていない Playable Layer(s) も SDK 付属の AnimatorController をコピーして埋めておく」 ことで解決できることがあります。 特に、 Non-humanoid Rig で Base Layer が上手く動かないという場合はこれを試してみると解決する可能性が高いです(僕の田植え機とエアダスターもこれで修正できました)。

補足3: Write Defaults について

Unity をあまり触らない人にはなんだかよくわからない話です。僕もよくわからん。

Write Defaults というのは、Animation Clip で変更されていないプロパティーにデフォルトを値を書き込むというオプションで、これまた 2020/10/28 のアプデ以降で VRChat 側ではこのオプションを使用しない ようになりました。 これによってそれ以前に発生していた「特定条件でプロパティの適用値が n 倍になってしまう」などの不具合が修正されたようですが、一方で従来の Write Defaults オン状態の挙動に依存していた Animation/AnimatorController は作り直す必要が出てきました。具体的にはデフォルトの値が自動で書き込まれなくなるので、手動で書き込むようなステートを追加する必要が出てきたわけです。

表情を変える仕組みを入れるだけの場合、かえってそちらのほうが面倒であること、また FX Layers では Write Defaults がオンでもそこまで問題にならないと思われることなどから、 この記事では Write Defaults オンの状態で解説します。 オフにする必要が出てきた場合に都度対応していただければ……(多分その頃にはある程度自分で対処できるようになると思います)。

Animator Parameters

Animator Parameters は、 VRChat 側で自動的に更新され、 Animator Controller から参照することができる値です。デフォルトで以下のようなものが用意されている他、 最大 16 個までユーザーで定義することができます。

  • IsLocal: ローカルの時 true
  • Viseme: リップシンクの Visemes の番号
  • GestureLeft GestureRight: 左/右コントローラーのハンドサインの番号
    • 0 から順に Neutral, Fist, HandOpen, Fingerpoint, Victory, Rock'n'Roll, HandGun, ThumbsUp
  • GestureLeftWeight GestureRightWeight: 左/右コントローラーのトリガー押し込み量
    • ……と、公式ドキュメントには書いてありますが、実際には文字通りジェスチャーのウェイトなのでトリガー以外でジェスチャーを作っている場合でも 1.0 になります。
    • トリガーだけに絞りたい場合は、 GestureLeft/Right を同時に参照するなどで対処できそうですが……
  • AngularY: Y 軸方向の角速度
  • VelocityX VelocityY VelocityZ: X/Y/Z の速度(単位は m/s)
  • Upright: 伏せている時 0.0 、立ってる時 1.0
  • Grounded: 地に足ついている時 true
  • Seated: 座ってる時 true
  • AFK: AFK の時 true

ユーザー定義の Animator Parameters は Expressions Parameters アセットで指定することができます。 それぞれのパラメーターについて、 Animator Controller から参照するエイリアス名と型を指定します。

Expressions Menu

UI でもっとも見た目が変化したポイントでしょう。メニュー項目はユーザー側で自由に追加することができます。なお、ページごとに追加できる要素数は 8 コまでのようです。

また、それぞれの項目にアイコン画像を割り当てられます。用意するのが面倒な人は顔とか基本的なものが SDK サンプルとして用意されているのでそれを使うと良いでしょう。 宣伝: 顔パーツの操作用に AV3 Facial Icons というのを公開しました。よければご利用ください。

Button

f:id:kb10uy:20200808004124p:plain

普通のボタンです。メニューで押した瞬間から少なくとも 0.2 秒の間、指定した Expression Parameter が指定した値になり、そのあと 0 に戻ります。 トリガーを押し込んでいる間はずっと 1.0 のままになるようです。

Toggle

f:id:kb10uy:20200808004248p:plain

オンオフを保持できるボタンです。挙動としては勝手にオフにならない Button という理解でよいでしょう。 また、これはドキュメントに書いてないっぽい仕様なんですが、同じ Expressions Menu の中では同時にオンになるのは 1 つだけになるようです。いわゆるラジオボタンのような動作です。

※2020-8-11 追記: 変数を分けた場合はやはりちゃんと別々にトグルするようです。 xlwnya さんありがとうございます。

f:id:kb10uy:20200808004346p:plain

メニュー項目を入れ子にできます。項目数が増えてきたり、ジャンルごとに項目を分ける際に便利です。 Expression Parameter を指定する項目がありますが、これはメニューを開いた・閉じたを判定できるようです。

Submenu に Submenu を入れることももちろんできます。

Two Axis Puppet

f:id:kb10uy:20200808004440p:plain

コントローラーのジョイスティック・トラックパッドで X/Y 軸 それぞれに Float 型の Expression Parameter を割り当てて同時に操作できるものです。 下・左方向めいっぱいで -1、 上・右方向いっぱいで +1 になります。なお、円の中を移動するので両方の絶対値が 1 になることはありません。

さらに、 Horizontal/Vertical の上にもう一つ Expression Parameter を指定できる項目があり、Submenu 同様に項目の開閉を判定できます。

f:id:kb10uy:20200808004800g:plain

上の画像のように、同じ軸上に対になるアニメーションなどを割り当てて使うと便利です。

Four Axis Puppet

f:id:kb10uy:20200808005234p:plain

Two Axis Puppet は -1~+1 の範囲で 2 つの Expression Parameter を操作できましたが、こちらは 0~1 の範囲で 4 つの Expression Parameter を操作することができます。 隣同士の項目は値が徐々に変化していくので、対にはならないけど滑らかに変化させたい用途に使えるんじゃないでしょうか。

表情を入れる

さてこの記事の目玉パートです。AV3 では AV2 の Animator Override が使えなくなってしまったため、困っている方も多いのではないでしょうか。 僕は今日半日つぶして 眉/目/瞳/涙/口 の個別アニメーションを導入したので、表情を入れたりする方法を解説しようと思います。

なお、従来のようにジェスチャー(ハンドサイン)で表情を切り替えるものではなく、 Expressions Menu を活用して多機能に切り替える方式となります。 ハンドサインで切り替えたい場合は以下の記事などを参照するとよいかもしれません。

じゃあこれから解説する方法のメリットは何なんだという話ですが、

  • 掛け算で膨大なパターンの表情を出し分けられる
  • Unity と 和解しやすくなる

とか、そういう感じじゃないでしょうか。前者については、例えば僕の夏稀のアバターでは単純計算で 750 種類の表情が出せるようになっています。 それと後者は AV3 時代を生き抜くためには特に重要になってくるのではないでしょうか。ゲーム制作とか(Unity に限らず)ゲームエンジンの知識があれば別ですが、 VRChat プレイヤー、ひいてはアバターをアップロードするユーザーがみなそのような知識を持ち合わせているとは限りませんし……。

この手順通してなんですが、どういう表情表現をしたいかを常に考えながらやるとスムーズに行きます。 あと情報科学の知識、特にステートマシンの知識があると大幅に捗ります。

1. Avatars 3.0 の SDK を用意する

いつもの VRChat SDK のダウンロードページに行くと、 VRCSDK3 の方が Avatar と World で分かれていると思います。 Avatar の方をダウンロードしましょう。

2. Unity プロジェクトを新規で用意する

事故るので 新規で 用意しましょう。 kb10uy との約束だぞ! VRCSDK3 において World と Avatar を同居させるのは非推奨ながらもできなくはないようですが、SDK2 のプロジェクトに追加インポートするのはかなり不具合などが起きやすいようです。

3. アバターをインポートしたりする

ここは従来通りです。VRChat 向けのプラグインは多くが使えないようですが、もちろんカスタムシェーダーは使用可能です。 VRC Avatar Descriptor をアタッチすると何やら項目がめっちゃ増えていますが気にしてはいけません。

4. VRC Avatar Descriptor のプロパティを設定する

View Position

f:id:kb10uy:20200808010556p:plain

視点のやつです。 SDK2 から進化した点として、 Edit ボタンを押すとシーンビューでハンドルをドラッグして視点の球を移動できるようになりました。

LipSync

リップシンクの設定です。これも SDK2 とほぼ同じなのでそんなに迷うことはないと思いますが、Auto Detect は上手く動かないので Mode は手動で Viseme Blend Shape を選択しましょう。 Face Mesh を選択すれば Visemes の BlendShape 自体は自動検出されるようです。

ちなみに Mode の他の種類について、 Jaw Flap Bone は顎のボーン、 Jaw Flap BlendShape は顎のシェイプキーで動かすものです。

Eye Look

AV3 で増えた項目。AV2 ではちょっとしたハックが必要だったり詳細な仕様があまり明かされていなかった目の動きですが、AV3 ではこれも明示的に指定できるようになりました。 ということで、いわゆる lowerlid や blink の BlendShape を先頭に置いておく作業は必要なくなりました。やったね!

Enable を押すと以下の項目が展開されます。

  • General
    • 全般。
    • Eye Movements
      • ランダムな目の動きの指定。
      • Calm ~ Excited: まばたきの多さ。右に行くほど多い
      • Shy ~ Confident: 目の動きの激しさ。右に行くほど他のプレイヤーを見ている時間が長くなる。
        • 一部のアバターでは Shy 側に倒しておくことが推奨されているらしい?
        • 目のボーンのウェイトの都合らしい
  • Eyes
    • 目玉の動き。
    • Transforms
      • 目のボーンをここで指定する
      • Humanoid リグ側の指定が無視されるのかは不明
    • Rotation States
      • 上下左右を向いた時のボーンの回転を指定できる
  • Eyelids
    • 下まぶた・まばたきの動き
    • Eyelid Type
      • ボーンと BlendShape どっちで動かすか。ほとんど後者
    • Eyelids Mesh
      • 基本的に Face Mesh と同じ
    • Blink
      • まばたきの BlendShape
    • Looking Up
      • 上向いたときのまぶたの BlendShape
    • Looking Down
      • 下向いたときのまぶたの BlendShape

Playable Layers, Expressions

後述

Lower Body

下半身の動作が指定できるっぽいですね。僕はフルトラじゃないので真の効果については検証できないんですが……。

  • Use Auto Footstep ~: 3/4 点トラッキング(要は非フルトラ)のときに自動で「足踏み」をします。
    • 簡単にいうと足がちゃんと地面に吸着するような感じになります。
    • そのかわり、ごく低速で移動しているときに足がめっちゃせわしなく動いて見た目がキモ面白くなります。
  • Force Locomotion Animations ~: 6 点トラッキング(フルトラ)のとき、移動時に Base Layer のアニメーションを使用します。
    • オンの場合は現実とは関係なくアニメーションが再生されます。
    • オフの場合は現実のトラッキングの内容が反映されます。

5. Expressions Menu と Expressions Parameters アセットを作る

プロジェクトビュー右クリックから 作成→ VRChat→Avatars と辿って Expressions Menu と Expressions Parameters を作成します。名前は適当に決めてください。 そうしたら、対象のアバターの Descriptor に Expressions という項目があるはずなので Customize をクリックして展開し、今作った 2 つのファイルをそれぞれに割り当ててください。

f:id:kb10uy:20200808021244p:plain

Expressions Parameters

Expressions Parameters を選択すると、インスペクタにこういうのが出ると思います:

f:id:kb10uy:20200808020332p:plain

デフォルトで上の 3 つが埋まっていますが、デフォルトの Emotes を使わないならいらないので消して大丈夫です。 そして、必要なパラメーターを設定していきます。と、言うのは簡単ですが実際にアニメーションにどういうパラメーターが必要かなんて最初はわからないので、以下の指針でやっていくと良いかもしれません。

  • ブレンドせずに固定の表情を切り替えたい場合は Int 型のパラメーターを用意する
  • いくつかのアニメーションをなめらかに変化させたい場合は Float 型のパラメーターを用意する

説明のために、 FaceIndex という Int 型のパラメーターと FaceX, FaceY という Float 型のパラメーターを用意します。

f:id:kb10uy:20200808022126p:plain

Expressions Menu

続いてメニュー項目を作っていきます。こちらもどういう風に表情を変化させたいかによって構成を変えますが、ブレンドしないなら Button 、 ブレンドするなら Two/Four Axis Puppet を選択するのがよいでしょう。 出し入れするタイプのものなら Toggle もありですが、複数の中から一つを選ぶなら Button が適切っぽそうです。(2020-8-8 11:31 追記) Toggle は同時に一つ以上はオンにならないようなので、複数の中から選択する場合も Toggle で問題ないようです。

Button または Toggle を選択した場合、名前(日本語可)とアイコン(任意)を入力したあと、 Parameter から FaceIndex を選択します。 Value の項目に自動的に 1 が入力されますね。複数の表情を出したい場合は同様にボタンを作っていき、 Value をそれぞれ違う値にしましょう(連番推奨)。

f:id:kb10uy:20200808021537p:plain

Two Axis Puppet を選択した場合、名前とアイコンを入力して、 Parameter Horizontal に FaceX を、 Parameter Vertical に FaceY を割り当てます。一応注意点として、このメニューの座標系はデカルト座標系なので Y 軸は上が正になります。 Label Up, Right, Down, Left にも名前とアイコンを設定できるので、適宜設定しましょう。イメージとしては以下のような感じになります。同じ軸に対になるアニメーションを入れる感覚で。

f:id:kb10uy:20200808022155p:plain

6. アニメーションアセットを作る

ここは AV2 のときとほぼ同じ感覚で作れるので省略します。普通に BlendShape をいじって 2 フレームの表情のアニメーションを作っておけば OK です。正直この作業が一番大変でした。以下のようなアニメーションを作ったとしましょう。

f:id:kb10uy:20200808022450p:plain

7. Animator Controller を作る

ここが一番しんどくて難解です。がんばりましょう。

右クリック→作成→アニメーターコントローラー で適当な名前で作成し、ダブルクリックでアニメータービューを開きます。

標準状態のステートを作る

f:id:kb10uy:20200808022740p:plain

最初は上のような状態になっています(Exit はめっちゃ遠くにあるので寄せておきましょう、どうせ使わないので)。 右側のところで右クリック→作成→空 と進んで空のステートを作成します。表情を作っていないときはここにいるというわけです。 勝手にオレンジ色になって Entry から矢印がつながります。

f:id:kb10uy:20200808023025p:plain

作ったアニメーションを配置する

  1. で作ったアニメーションを右側のところにドラッグすると、そのアニメーションを再生するステートが作成されます。重なってるのを広げるとこんな感じ:

f:id:kb10uy:20200808023209p:plain

遷移を作成する: Button/Toggle 式の場合

Button で切り替える場合は Int パラメーターを参照することになります。 左側上部の「パラメーター」をクリックするとアニメーションパラメーターの一覧が出るので、右の + ボタンをクリックして新しいパラメーターを追加します。 Int を選択し、名前を FaceIndex にします。Expressions Parameters で付けた名前と大文字小文字も一致させる必要があります。 VRChat では、メニューの操作に応じてこの値が勝手に変わるわけです。

f:id:kb10uy:20200808023658p:plain

で、変わった値を捕捉してその値に応じて表情を変化させたいので、遷移を作成します。 Any Stateを右クリックして「遷移を作成」を選択するとマウスカーソルに向かって矢印が伸びるので、さっき配置したアニメーションのステートに伸ばします。これを表情の分だけ繰り返します。

※Any State: ここから伸ばした遷移は元がどんなステートでも遷移することができる

f:id:kb10uy:20200808024011p:plain

次に矢印をクリックします。インスペクタの表示が変わったと思います。そして下のほうに Conditions というのがあります。ここに遷移条件を指定していくことでアニメーションの変化を実現します。 + をクリック、そして左側の リストから FaceIndex、右側のリストから Equals、 最右部のボックスに 1 を入力しておきます。で、結果として「FaceIndex が 1 になったときにこの遷移が発生する」という動作になります。 この 1 という値は Expressions Menu Value に設定した値に対応します。この例だと「笑い」に 1、「泣き」に 2 を設定したので、この条件の値にもそれを入れましょう。

f:id:kb10uy:20200808024517p:plain

遷移を作成する: Axis Puppet 式の場合

※自分でもちょっと面倒だなあと思っているので簡単な方法をご存知の方はおしらせください。

Two Axis Puppet などでブレンドする場合は 2 つの Float パラメーターを参照します。 パラメーターリストを表示して、Float を選択して FaceXFaceY を作成します。Expressions Menu の名前と一致させるよう気を付けてくださいね。

f:id:kb10uy:20200808025121p:plain

その後、右側で右クリック→ステートの作成→新規のブレンドツリーから を選択し、ブレンドツリーを作成します。 ブレンドツリーというのは複数のアニメーションをいくつかのパラメーターに合わせて自動で混ぜてくれるすごいやつです。一般的にはは歩き・走り・横歩きとかを滑らかに変化させるために使います。

f:id:kb10uy:20200808025435p:plain

Blend Tree という項目が作成されるのでそれをダブルクリックすると Blend Tree 内のビューに移行します。中央に Blend Tree というのが出てきたと思います。これをクリックしておきましょう。 インスペクター最上部にブレンドタイプというのがあるので、リストから 2D Freeform Cartesian を選択します。するとそのすぐ下に Parameters というのが出てきますから、左のリストから FaceX, 右のリストから Face Y を選択しましょう。

f:id:kb10uy:20200808025708p:plain

続いてさらにその下に Motion というのがありますが、そこの + ボタンでブレントしたいアニメーションを追加します。 多くの場合 4 つ 用意しているでしょうから、 4 回追加します。「+ ボタン→モーションフィールドを追加」です:

f:id:kb10uy:20200808025905p:plain

こんな表示になったでしょうか?Pos X Pos Y という値がそれぞれに設定されていますが、これがデタラメな値になっているのでそれぞれを以下のように設定します。これにより、上から順に上下左右方向のブレンドになります。

f:id:kb10uy:20200808030101p:plain

そして、「なし(モーション)」となっている箇所に割り当てたいアニメーションをドラッグします。自動的に左側の Blend Tree の横にアニメーション名の項目がつながって出てきます。

f:id:kb10uy:20200808030222p:plain

これが終わったら、上部バーで「Base Layer > Blend Tree」みたいになってるところの Base Layer を選択して元の画面に戻り、Entry を右クリックして「ステートマシンのデフォルトステート~」を選択、先ほどの Blend Tree に繋げます。 これで最初からブレンドが走るようになります。とはいえ、デフォルトで FaceX, FaceY は 0.0 なので表情は変化しません。

f:id:kb10uy:20200808030456p:plain

……と、簡単にやるならこのセクションはここまでです。 8. に進んでください。もうちょっと細かく制御したい人は以下の内容も読むことをおすすめします。

Button/Toggle 式でデフォルトの表情に戻す

上で説明した方法だけでは元の表情に戻ることはできません。なぜならば元の表情に戻る遷移が存在しないからです。その遷移を追加します。

追記: やることは単純で、FaceIndex = 0 で AnyState から デフォルト(オレンジ色)のステートに戻る遷移を追加 します。こうすれば254 個ぐらいは表情を切り替えられることになります(Int パラメーターは 0~255まで)。

以下の手順は不要になりました。一応残しておきますが…… Expressions Menu の Button は 0.2 秒程度でパラメーターが 0 に戻ってしまうので、0 になったときに遷移してしまうと 0.2 秒程度しか表情を出せません。 そこで、 0 は未定義の状態として触らないでおき、 Expressions Menu に Value = 255 で元の表情に戻る Button を追加します。そして、FaceIndex = 255 で AnyState から デフォルト(オレンジ色)のステートに戻る遷移を追加 します。 なお、Toggle パラメーターは ずっと 1 が保持されるので 0 をオフ状態への遷移条件として使ってしまって問題ありません。

Axis Puppet 式で微妙な表情になるのを防ぐ

Axis Puppet は便利ですが、例えば 2 つの表情が 0.2 ずつぐらい微妙に混ざって美少女がしてはならないような表情になってしまうことがあります。これを防ぐために、閾値を設定するという方法があります。 やり方としては次のようになります。

  1. デフォルトのステートを空のステートにしておく
  2. 空のステートから Blend Tree に向かって 4 本の遷移を作成する
  3. それぞれの遷移に、以下の条件を 1 つずつ設定する(0.7 という数値はオンになる閾値なのでお好みで):
    • X > 0.7
    • X < -0.7
    • Y > 0.7
    • Y < -0.7
  4. BlendTree から空のステートに向かう遷移を作成し、以下の条件を全て設定する(0.3 という数値はオンになる閾値なのでお好みで):
    • X < 0.3
    • X > -0.3
    • Y < 0.3
    • Y > -0.3

これで、 0.7 以上のとき初めてオンになり、 0.3 以下のとき初めてオフになるようになります。

Axis Puppet 式でデジタルに切り替える

Axis Puppet でもデジタル切り替えを行うことができます。作り方としては以下のようになります(説明例は Two Axis Puppet の場合):

  1. Button/Toggle 式と同じように遷移を作成する
  2. 条件を以下のうちの一つにする(閾値はお好みで):
    • X > 0.7
    • X < -0.7
    • Y > 0.7
    • Y < -0.7
  3. Any State から空のステートに向かう遷移を作成し、以下の条件を全て設定する(閾値なのでお好みで):
    • X < 0.3
    • X > -0.3
    • Y < 0.3
    • Y > -0.3

f:id:kb10uy:20200808114312p:plain

複数のパーツを個別に動かす

これには Animaton Layer を使います。 VRChat の Layer ではなく Animation Controller の Layer です。

左側上部の レイヤー をクリックしてレイヤー一覧を出し、右の + を押すとレイヤーを追加できます。パーツに対応した名前でも付けてあげましょう。 次がめっちゃ重要で、右側の歯車をクリックしてウェイトを 1 に設定します。これを忘れるとアニメーション設定が正しくても動いてくれません。僕はこれを忘れて 2 回ぐらい無駄にアップロードしました。 これ他の人の解説記事などを見てもみんな忘れがちと言っているので本当に忘れがちなんだと思います(?)。

f:id:kb10uy:20200808031400p:plain

新しいレイヤーは他のレイヤーとは独立に同時に動くので、上に書いたことを同じようにやれば個別に動かすことができます。自分のアバターでは以下のような感じで構成しています。

f:id:kb10uy:20200808114648p:plain

表情と目・リップシンクが干渉しないようにする

リップシンクと目のシミュレーションですが、作りたい表情と干渉することがよくあると思います。 その場合、「(干渉する)表情を作っている時だけリップシンクなどを切る」という動作を入れなければなりません。 これを担当するのが VRC Animator Tracking Control というビヘイビアです。

ただし、これを実装する場合は Any State から生やすのを諦めたほうがいいかもしれません。 この方法は Animator Controller のグラフが比較的スッキリするのですが、文字通りどこからでも遷移してしまうため以下に書くことを実装しようとするとうまく表情が切り替わらなくなってしまいます。 Exit から抜けた後はすぐに Entry に戻るので、頑張って変更してください(なげやり)。

さてやり方ですが、干渉させたくない表情のアニメーションステートをクリックして、インスペクターからビヘイビアを追加、VRC Animator Tracking Control を選択します。似た名前のビヘイビアが多いので注意してください。

f:id:kb10uy:20200811230240p:plain

すると上のような項目が追加されたと思いますので、目の動きを止めるなら Eyes & Eyelids 、口の動きを止めるなら Mouth & Jaw のチェックを Animation の列に移動します。同じ行では 1 つしかチェックが入らないようになっています。 これでこの表情に入った時はトラッキングが止まる(=自動アニメーションが無効になる)ようになります。

続いて、別の干渉しない表情に入った時にトラッキングをまた有効化しなければならないため、新しくステートを作成します。 同様に VRC Animator Tracking Control を追加し、さっきチェックボックスを移動した行について、今度は Tracking に移動します。 このステートは Exit への遷移を追加しておきましょう。

そして、干渉する表情から新しく作ったステートへの遷移を作成します。条件は、「その表情に遷移する条件の NOT 条件」にします。 例えば前者の条件が「FaceIndex / Equals / 0」ならば、「FaceIndex / NotEqual / 0」を設定しましょう。

f:id:kb10uy:20200811230922p:plain

(画像では自分のアバターのやつを説明に使い回していますが基本は同じです)

これで干渉が防げるようになったと思います。なお、干渉するアニメーションが複数ある場合は表情の手前に トラッキングを無効化するだけのステートを差し込んでそこから分岐させると手間が省けます。

f:id:kb10uy:20200811225721p:plain

8. Playable Layers に割り当てる

これで最後です。シーンビューに戻り、アバターの Descriptor の下のほうの Playable Layers の Customize をクリックして展開します。

FX の右のボタンをクリックし、出てきたボックスに長々と作ってきた Animator Controller を割り当てます。

f:id:kb10uy:20200808031601p:plain

9. アップロードして確認する/ローカルテストする

SDK3 ではアバターもローカルテストできるようになったようです。 いつもの コンパネに Build & Test という項目があると思いますが、これをクリックすると PC のどっかにアバターのパッケージが生成され、それが VRChat から参照できるようになっています。Other のところに SDK: ほげほげ みたいな項目が出てくるので、それをクリックして(プレビューは更新されませんが正常です) Change すればテストできます。

f:id:kb10uy:20200808032509p:plain

また、うまくいかない場合はゲーム内デバッグウィンドウが便利です。各種パラメーターの状態が確認できます。

f:id:kb10uy:20200808032254p:plain

おしまい

追記したりしてたら結構長い記事になってしまいましたが、これらの手順をマスターすればアバターの表現力が格段に上がることでしょう。あと Unity と和解できます

何か不備や要望があれば Twitter(@kb10uy)Mastodon (@kb10uy@mstdn.maud.io) までお知らせください。

よき Avatars 3.0 ライフを!