がとーしょこらの技術録(旧)

記録や技術的な記事を書いていきます

[VRChat] Avatars3.0で表情切り替え時のまばたき干渉防止を実装する

はじめに

EyeLookの設定によって自動まばたきが有効になっている場合、
目を動かす表情変更をおこなうと干渉して目が意図しない見た目になることがあります。

f:id:gatosyocora:20200809091024p:plain
自動まばたきが有効になっている

本記事ではこれを防止する方法を解説していきます。

動作確認環境

  • Unity 2018.4.20f1
  • VRCSDK3-AVATAR-2020.08.06.16.30_Public.unitypackage

実装する手順

Avatars3.0のVRCSDKで追加されたVRCAnimatorTrackingControlを使います。
これはHeadやLeftHandなどの動きを

を切り替えることができるBehaivourです。
Humanoidのボーンだけでなく, 目や口の動きも切り替えることができるようになっています。
このBehaivourと呼ばれるものはGameObjectにつけるComponentみたいなものでAnimatorControllerのStateにつけるスクリプトです。

本記事では表情切り替えギミックのよくある実装方法であるVRCSDKに同封されたvrc_AvatarV3HandsLayer.controllerを複製して実装したとして説明していきます。
まばたき干渉防止の実装の考え方としては他の実装方法でも使えると思うので各自読み替えてください。

まず, 表情切り替えのギミックが設定されたAnimatorControllerのLayerを表示します。
よくある方法で実装されている場合は、
VRCAvatarDescriptorのFXに設定されたAnimatorControllerのLeftHand, RIghtHandがこれにあたるかと思います。
FXの設定されている部分をダブルクリックするとAnimatorウィンドウに表示されると思います。

f:id:gatosyocora:20200809091650p:plain

f:id:gatosyocora:20200809092203p:plain

実装の方針としては

  • 表情切り替えしていないIdle状態 : スクリプトによって目が操作される
  • 表情切り替えしている状態 : Animationによって目が操作される

のようにしていきます。

LeftHandでは橙色のStateがIdleが表情切り替えしていないIdle状態にあたります。

f:id:gatosyocora:20200809092502p:plain

また、Fistなどの灰色のStateが表情切り替えしている状態にあたります。

f:id:gatosyocora:20200809092516p:plain

まず, IdleをクリックしてInspectorに詳細を表示します。

f:id:gatosyocora:20200809092727p:plain

Add Behaivourを選択して、VRCAnimatorTrackingControlを追加します。

f:id:gatosyocora:20200809092832p:plain

Eyes & EyelidsのTrackingチェックをいれるようにします。
これでこのIdleのStateにきてから変更されるまでは目の動きはスクリプトによって操作されるようになりました。

f:id:gatosyocora:20200809093009p:plain

次に同じ手順でFistなどの表情切り替えしている状態のStateにもVRCAnimatorTrackingControlを追加します。
ここではEyes & EyelidsのAnimationチェックをいれるようにします。
これでこのStateにきてから変更されるまでは目の動きはAnimationによって操作されるようになりました。

f:id:gatosyocora:20200809093127p:plain

同様にOpenやGunなどの表情切り替えしているStateにも同じ設定をしてください。

これでまばたき干渉防止を実装することができました。

発展(リップシンク干渉防止)

発展として表情切り替えとリップシンクが干渉してしまう問題も同じような方法で防ぐことができます。
これはまばたき干渉防止と両立することができます。

表情切り替えしていないStateにつけたVRCAnimatorTrackingControlでMouth & JawのTrackingチェックをいれます。

f:id:gatosyocora:20200809093539p:plain

また、表情切り替えしているStateではMouth & JawのAnimationチェックをいれます。

f:id:gatosyocora:20200809093730p:plain

これでリップシンク干渉防止を実装することができました。

参考