一時的にハンドサインによる表情制御を無効化する[VRChat Avatars3.0]
今回は、ジェスチャーによる表情変化を一時的に無効化してみます。
どういうときに使うかというと、写真撮影などです。
例えば、普通にピースサインをした場合、当然ですが紐づけられた表情が出ます。
ですが、それではなく他の表情を使いたい場面もありますよね。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/VRChat_1920x1080_2021-06-22_00-20-56.859-1024x576.png)
想定読者
- Avatars 3.0でアバターをアップロードしている
- 表情がアバター独自に設定されている(販売アバターならまず大丈夫)
- 表情制御の仕組みを基礎でも知っているとスムーズ
Contents
何をしたいのか
VRChat内のAction Menuには、デフォルトの設定でGesture Toggleという設定があります。
これを切り替えると、コントローラの状態にかかわらず現在の形でハンドサインが固定されます。
つまり、ジェスチャーと、紐づけられた表情が両方固定されます。
違う。そうじゃない。
それでは目的を果たせません。
一時的に、表情とハンドサインを独立して動かしたいわけです。
これが設定できれば、例えば「怒った表情で平手打ち」などができるようになります。
(多くの場合、HandOpenには笑顔が設定されている印象なので)
あとは、一部の癖の強い表情(端的に言えばNSFWっぽい表情)が暴発しないようにするなど。
いずれにせよ表現の幅と安定性を高められます。
大まかな方法
- ジェスチャーをロックするためのParameterを作る
- FXレイヤーの遷移条件を追加する
こんな感じです。
これでわかる人は自分で実装している気がします。
なので、ここから解説していきます。
表情ロック用のParameterを追加する
まずは、表情をロックするためのParameterを追記します。
アバターに設定されているParametersのファイルを開きます。
もし場所がわからない場合は、以下の手順でジャンプできます。
Scene上でアバターを選択し、InspectorのVRC Avatar Descriptorを見ます。
下の方に、画像のような設定部分があるのでクリックします。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-163720.png)
Parametersのファイルを開き、空いている欄に以下を追記します。
ExpressionLock, Bool
(名前は任意でいいですが、大文字小文字も含めて覚えておきましょう)
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-164326.png)
Animation Controllerの設定
Parameterを追加する
次に、上で追加したParameterを制御に利用できるようにします。
アバターのFX Layerに設定されているAnimation Controllerを開きます。
場所がわからない場合は、上と同様にAvatar Descriptorで該当部分をクリックします。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-164848.png)
該当のファイルを開き、Parametersのタブを開きます。
こちらに、BoolでExpressionLock (先ほど追加した名前)を追加します。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-165011.png)
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-165035.png)
遷移条件を追加する
追加したら、Layersタブに戻ります。
ここからがアバターによって違うのですが、Handなんとかというレイヤーを選択します。
アバターによってはRightHandとLeftHandで2つレイヤーがあるかもしれません。
名前から判別できない場合は、レイヤーの矢印(Transition)のどれかをクリックしてみます。
下の方の遷移条件にGestureLeft/GestureRightがあればそのレイヤーが正解です。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-165534-1024x291.png)
NeutralやIdleなどという名前の状態につながる矢印以外を選択します。
Conditionsの+ボタンを押して、遷移条件を追加します。
ここに、先ほど追加したParameterを利用して、
GestureLock, False を設定します。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-170342.png)
Animation Controllerの遷移条件(Conditions)はAND条件です。
GestureRightとExpressionLockが共に条件に合った場合遷移することになります。
この場合、ハンドサインが特定の形かつ、ExpressionLockが無効の場合、となります。
この作業を、Idle/Neutralなど(要するにデフォルトの表情)に続く矢印以外に行います。
WriteDefaultsがOnになっているアバター(多分その方が多い)の場合は
原則すべての遷移に対して追加してください。(ご指摘ありがとうございます)
アバターによって表記が違うので明確な指示ができないのですが、
おそらくオレンジ色になっているStateがデフォルト表情のはずです。
特定の表情のみロックしたい場合は、そのStateへの遷移だけ作業すればOKです。
(理解者向け)
もし、RIghtHandとLeftHandでレイヤーが分かれている場合、両方に行いましょう。
追記:FXとGesturesレイヤーに同じAnimationが入っている場合
販売アバターに同様の操作をしても、表情の連動が切れない現象がありました。
原因としては、Gesturesレイヤーにも表情のAnimationが入っていたからです。
若干手間ですが、ハンドサインに入っているAnimationをすべてコピーして、
表情のBlendshapesをすべて削除した版をGesturesレイヤーに差し替えることで解決しました。
おそらく、指の形と表情を同時に指定しなければならなかった2.0の名残です。
3.0では、Gesturesレイヤーで指の制御、FXレイヤーで表情と分けられます。
どうもGesturesは描画優先度がFXより高く、ExpressionsMenuでの指定にも優先してしまうようでした。
そもそも今回個人的に解決したかった問題は、
「ExpressionsMenuで表情を指定しているのにジェスチャーの表情が優先される」ことです。
ここに問題があったのであれば単にExpressionsMenuのレイヤーをハンドサインより上にするだけでよかった気がします
それでもって「真顔」をExpressionsMenuに追加すれば同じ効果がよりシンプルに得られますね
こちらのトラブルシューティングを記事にした方がよかったかもしれない…
見切り発車はよくないですね
Expression Menuにスイッチを追加する
次に、ExpressionLockを切り替えるためのスイッチを作ります。
アバターに設定されているExpressions Menuを開きます。
場所がわからない場合は例によって画像の通りに移動してみてください。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-171809.png)
Avatars 2.0から最低限の作業量で移行した場合や、
自作アバターで特に作業を行っていない場合、ここが空欄の可能性があります。
その場合、Assets内でDefaultExpressionsMenuを検索し、コピーするなどで作成します。
適当な名前をつけて、画像のMenuの欄にドロップして設定しておきます。
ExpressionsMenuのファイルを開き、Add Controlから以下を設定します。
Toggle, ExpressionLock
スイッチ名自体は任意でも構いません。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/スクリーンショット-2021-08-09-172424.png)
これで、設定は完了です。
VRChat内で確認する
設定内容が反映されているか、VRChat内で確認します。
予めBuild & Testかアップロードを行い、アバターを利用可能にしておきます。
Unity2019からアップロード速度が上がったので、待ち時間の差は縮みました。
しかし、Parameters関連をいじっているので念のためテストを挟むのがおすすめです。
ちゃんと機能している版を上書きしてしまうと面倒なので…
上手くいっていれば、ExpressionsMenuからExpressionLockをオンにしている間だけ
表情が切り替わらなくなるはずです。
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/VRChat_1920x1080_2021-08-09_18-03-13.868-1024x576.png)
![](https://chimerabbit.com/wp/wp-content/uploads/2021/08/VRChat_1920x1080_2021-08-09_18-03-35.870-1024x576.png)
その間、他のExpressionsMenuを利用した表情は使えるはずです。
これによって、ジェスチャーは自由なものを利用しながら
表情はまた別で設定することができるようになります。
意図した通りの動きをしていれば成功です。
お疲れ様でした。
ちなみに、これを逆用すると、
「BattleModeがTrueのときだけハンドサインで銃を撃つ」などもできるはずです。
さらに高度なものでは表情をパレット分けするなど…
今後、機会があれば実装してみようかと思います。