[VRChat] Avatars3.0で表情切り替え時のまばたき干渉防止を実装する
はじめに
EyeLookの設定によって自動まばたきが有効になっている場合、
目を動かす表情変更をおこなうと干渉して目が意図しない見た目になることがあります。
本記事ではこれを防止する方法を解説していきます。
動作確認環境
- Unity 2018.4.20f1
- VRCSDK3-AVATAR-2020.08.06.16.30_Public.unitypackage
実装する手順
Avatars3.0のVRCSDKで追加されたVRCAnimatorTrackingControlを使います。
これはHeadやLeftHandなどの動きを
- IKなどのスクリプトで操作するか
- Animationで操作するか
を切り替えることができるBehaivourです。
Humanoidのボーンだけでなく, 目や口の動きも切り替えることができるようになっています。
このBehaivourと呼ばれるものはGameObjectにつけるComponentみたいなものでAnimatorControllerのStateにつけるスクリプトです。
本記事では表情切り替えギミックのよくある実装方法であるVRCSDKに同封されたvrc_AvatarV3HandsLayer.controllerを複製して実装したとして説明していきます。
まばたき干渉防止の実装の考え方としては他の実装方法でも使えると思うので各自読み替えてください。
まず, 表情切り替えのギミックが設定されたAnimatorControllerのLayerを表示します。
よくある方法で実装されている場合は、
VRCAvatarDescriptorのFXに設定されたAnimatorControllerのLeftHand, RIghtHandがこれにあたるかと思います。
FXの設定されている部分をダブルクリックするとAnimatorウィンドウに表示されると思います。
実装の方針としては
- 表情切り替えしていないIdle状態 : スクリプトによって目が操作される
- 表情切り替えしている状態 : Animationによって目が操作される
のようにしていきます。
LeftHandでは橙色のStateがIdleが表情切り替えしていないIdle状態にあたります。
また、Fistなどの灰色のStateが表情切り替えしている状態にあたります。
まず, IdleをクリックしてInspectorに詳細を表示します。
Add Behaivourを選択して、VRCAnimatorTrackingControlを追加します。
Eyes & EyelidsのTrackingにチェックをいれるようにします。
これでこのIdleのStateにきてから変更されるまでは目の動きはスクリプトによって操作されるようになりました。
次に同じ手順でFistなどの表情切り替えしている状態のStateにもVRCAnimatorTrackingControlを追加します。
ここではEyes & EyelidsのAnimationにチェックをいれるようにします。
これでこのStateにきてから変更されるまでは目の動きはAnimationによって操作されるようになりました。
同様にOpenやGunなどの表情切り替えしているStateにも同じ設定をしてください。
これでまばたき干渉防止を実装することができました。
発展(リップシンク干渉防止)
発展として表情切り替えとリップシンクが干渉してしまう問題も同じような方法で防ぐことができます。
これはまばたき干渉防止と両立することができます。
表情切り替えしていないStateにつけたVRCAnimatorTrackingControlでMouth & JawのTrackingにチェックをいれます。
また、表情切り替えしているStateではMouth & JawのAnimationにチェックをいれます。
これでリップシンク干渉防止を実装することができました。