見出し画像

表情とリップシンクが干渉するのを防ぐ設定方法(Avatars 3.0)

Avatars 3.0(SDK3)が導入されてからしばらく経ちますが、未だに解説が少ないのと、以前tweetしたものが最近RTされていたので、検索性や閲覧性を良くするためにもnoteにまとめておこうと思います。

※SDK2アバターをAvatars 3.0に対応させる方法、Avatars 3.0で表情などを実装する方法は他の記事を参考にしてください。
※この記事は2021年5月時点で可能な方法を解説しています。


こんなものを作るよ

表情を出しているときに喋っても、表情の口の形と干渉せず正しくリップシンクする設定です。


事前に用意するもの

・干渉防止を実装したいAvatars 3.0対応済みのアバター


設定方法

まず、リップシンクに関係のない(口の)シェイプキーが動かないようにするAnimationを作成します。(ファイル名は何でも構いませんが下の画像では「LipSyncActive」としています。)
下の画像のように口の表情のシェイプキーの値をすべて0にして0フレーム目に登録してください。表情を作るときと同様にしてもらえば大丈夫です。
(ちなみにこれはCygnetちゃん用)

画像4


作成したAnimationのInspectorからLoop Timeにチェックが入ってることを確認してください。

画像8


次に、Playable LayersのFXに設定されているAnimatorを編集して行うので、Asset内のAnimatorファイルを選択してからAnimatorウインドウを開きます。

無題


Animatorウィンドウが開けたら、Animation Parametersを開いて「Viseme」という変数をInt型で追加します。
何らかの理由でこの変数が既にある場合は特に操作は必要ありません。

画像10


次に、Animator Layersに移ります。
ここで重要なのが、表情を制御しているレイヤーを把握することです。
例えば、下の画像では「Left Hand」と「Right Hand」が表情を制御するレイヤーです。(どれが表情を制御しているレイヤーかはステートに設定されているアニメーションを見て判断してください。)
表情を制御するレイヤーの下に「LipSyncController」レイヤーを追加します。

画像10


追加した「LipSyncController」レイヤーの右にある歯車を押してWeight値を1(右側)に、BlendingをOverrideに設定します。

画像9


「LipSyncController」レイヤーにステートと遷移(矢印)を下の図のように作ります。

画像10


さらに、下の画像の様に遷移条件を設定します。
※青く色がついている方が選択されている遷移(矢印)です。
(画像はクリックで拡大できます。)

画像7


先程作ったAnimation(ここでは「LipSyncActive」と名前をつけたもの)を「Sync_Active」のMotionに設定します。
「Sync_Inactive」のMotionはnoneで構いません。

画像10

リップシンクの干渉防止に関するUnityの操作は以上です。


仕組みの解説

Avatars 3.0ではリップシンクの制御をVisemというint型の変数で制御しています。公式のドキュメントを見ると、値が0の時は喋っていない時となり、値が1~14のときは喋っている時となります。そこで、喋っているときは表情の口の部分だけデフォルトの状態に戻すことで、リップシンクと干渉することを防止しています。
リップシンクの干渉防止だけであれば、今回の方法以外にもVRC Animator Tracking Controlを使用する方法があります。こちらの方法では、Animationを用意する必要はありませんが、表情を出している場合はリップシンクが完全に停止し、喋っていても口が動きません。


最後に

Avatars 3.0は以前のSDK2アバターよりも色々なことが様々な方法で制御できるようになりました。2021年夏頃に実装が予定されている、他の人の揺れものに干渉できる機能は基本的にAvatars 3.0 (SDK3)アバターのみとのこと。慣れ親しんだSDK2から離れるのは大変だと思いますが、あの娘のアホ毛やケモミミ、尻尾といった揺れものに触れるようにするためにも頑張りましょう…

この記事が気に入ったらサポートをしてみませんか?