Expressions Menu とは
Expressions Menu とは、Action Menu の一つであり、アバターに設定されたアニメーション(表情など)を再生するために利用される。Action Menu は、ジョイスティックのメニューボタンを長押しするか、キーボードの R キーを押下して開く。

Expressions Menu には、Sub Menu を追加できる。さらに、Sub Menu にも Sub Menu を追加できる。1つのメニューには項目を8つまで設定できる。つまりツリー構造になっている。

Expressions Menu の作成手順
- Gesture Manager をインストールする
- アニメーションを作成する
- メニューの構造を整理する
- VRC Avatar Descriptor を構成する
- レイヤーを構成する
- トラッキングを制御する
- メニューを構成する
- 動作をテストする
1. Gesture Manager をインストールする
- VCC(VRChat Creator Companion)にて、Gesture Manager をインストールする

2. アニメーションを作成する
- BlendShape から1フレームのループアニメーションを生成する
- 「BlendShape と proxy_tpose からアニメーションを生成する」という記事を参考にしてほしい
- キーのないアニメーションを作成する
- 以降「空のアニメーション」という

- 全ての BlendShape の値(表情やギミック)を初期化するためのアニメーションを作成する
- 0:00 と 0:01 における BlendShape の値が 0 のキーを追加する
- リップシンクやまばたきに使われる BlendShape は含めない
- 以降「初期化アニメーション」という
- 一度きりのアニメーションを除いた全てのアニメーションで Loop Time にチェックを入れる

3. メニューの構造を整理する
BlendShape の数が少ないなら問題ないが、BlendShape の数が多いと頭が混乱するので、事前にメニューの構造を整理する。(参考画像で利用しているモデルは、表情とギミックの数の合計が 50 個以上あり、頭の中だけで管理しきれない。)
- スプレッドシートにツリー構造を書き出す
- 直感的にアニメーション(表情)を探し出せるようにする
- 階層が深くならないようにする
- パラメータ名(変数名)を決定する
- Animator の Parameters と Expression Parameters を連動させるためには、パラメータ名が一致している必要がある。タイプミスを防ぐためにも、事前にパラメータ名を決定すべきである
- トラッキングとアニメーション(表情)が干渉するものを洗い出す
- 例えば、トラッキング(リップシンク)で口が開いている時に、Surprised のような口を開くアニメーション(表情)を再生すると、口の開きが異様に大きくなるため、アニメーションを再生している時は、トラッキングがオフになるよう設定する必要がある

4. VRC Avatar Descriptor を構成する
- Playable Layers > Customize をクリックする
- FX > Default Non-Transform をクリックする
- vrc_AvatarV3HandsLayer2 をセットする
- vrc_AvatarV3HandsLayer2 をクリックする

- vrc_AvatarV3HandsLayer2 を複製する(Ctrl + D)
- 複製したコントローラを適当なフォルダに移動させる

- 複製したコントローラを適当な名前に変更する
- 複製したコントローラを FX にセットする

- Expressions > Customize をクリックする
- Menu に DefaultExpressionsMenu を設定する
- DefaultExpressionsMenu をクリックする

- Default の Menu と Parameters を複製する(Ctrl + D)
- 複製した Menu と Parameter を適当なフォルダに移動させる

- 複製した Menu と Parameter を適当な名前に変更する
- 複製した Menu と Parameter を Expressions にセットする

5. レイヤーを構成する
前提として、レイヤーは上から順に実行される。
- AllParts レイヤーの Default State に初期化アニメーションをセットする
- 全ての State で Write Defaults のチェックを外す
- 最も上のレイヤーで常にアニメーションを初期化する
- 下のレイヤーでアニメーションを上書きしてゆく

- Expression Parameters に Bool 型のパラメータ(スプレッドシートに書き出したもの)を追加する
- パラメータの数が多く、手作業で追加するのが面倒な場合は、「VRC Expressions Parameters をテキストファイルから追加する」という記事を参照してほしい
- 同様にして、Animator の Parameters に Bool 型のパラメータを追加する

- 同時に再生できるアニメーション(State)はレイヤーを分ける
- 例えば、表情とアイテムのアニメーションは干渉しないのでレイヤーを分ける
- レイヤーを追加したら忘れずに Weight に 1 をセットする

- 同時に再生できないアニメーション(State)はレイヤーを出来る限り分けない
- 例えば、怒りと悲しみのアニメーションは干渉するのでレイヤーを分けない
- Entry から 空のアニメーション(State)に遷移するよう設定する
- Any State から各アニメーションに遷移するよう設定する
- 条件(Conditions)には、先に追加した変数をセットする

- Any State から空のアニメーション(State)にも遷移するよう設定する
- 条件(Conditions)は、他の遷移条件を全て否定するよう設定する

トラッキングとアニメーションが干渉しないようにする場合、State に VRC Animator Tracking Control を追加する必要な項目に関して、Animation にチェックを入れるまばたきと干渉しないようにする場合は、Eyes & Eyelids を選ぶリップシンクと干渉しないようにする場合は、Mouse & Jaw を選ぶ
- トラッキングとアニメーションは一つのレイヤーでまとめて制御した方が良い(後述)
- 全ての State で Write Defaults のチェックを外す(再掲)
- 他のレイヤーのアニメーションと Blend されないようにするためである
- 一度遷移した後に、他の State に遷移できなくなる事象を避けるためでもある

6. トラッキングとアニメーションを制御する
複数のレイヤーに VRC Animator Tracking Control がある場合、どれが優先されるか分からない。そのため、最後のレイヤーでトラッキングとアニメーションを制御する。
- まばたきを制御するためのレイヤーを追加する
- 空のアニメーションをセットした2つの State を用意する
- 参考画像では Animation と Tracking という名前にしている
- Default State はどちらでも構わない
- 一方の State に Behaviour「VRC Animator Tracking Control」を追加する
- Tracking にチェックを入れる

- 遷移条件に、トラッキングがオンであるべき条件(AND)を全て追加する
- 先に作成したスプレッドシートを見ながら作業すると良い

- もう一方の State にも Behaviour「VRC Animator Tracking Control」を追加する
- Animation にチェックを入れる

- 遷移条件に、アニメーションがオンであるべき条件(OR)を全て追加する

- リップシンクを制御するレイヤーも追加して同じように設定する
7. メニューを構成する
- メニューとサブメニューの数だけ、メニューのアセットを用意(複製)する
- サブメニューを設定する場合は、Type を Sub Menu に設定して、該当するメニューのアセットをセットする
- アニメーションを再生する場合は、Type を Toggle に設定して、パラメータに該当する変数をセットする
- 一度きりのアニメーションなどの場合は、Type を Button などに設定する

8. 動作をテストする
- Tools > Gesture Manager Emulator をクリックする
- Hierarchy に GestureManager が追加されることを確認する

- Play ボタンをクリックする
- GestureManager オブジェクトを選択する
- メニューが表示されるので動作をテストする

所感
読者に伝わっているのか不安である。とりあえず最も伝えたかったことは、最後のレイヤーで「VRC Animator Tracking Control」を制御すると良いということである。