VRC Expressions Menu の作り方

Expressions Menu とは

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

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

Expressions Menu の作成手順

  1. Gesture Manager をインストールする
  2. アニメーションを作成する
  3. メニューの構造を整理する
  4. VRC Avatar Descriptor を構成する
  5. レイヤーを構成する
  6. トラッキングを制御する
  7. メニューを構成する
  8. 動作をテストする

1. Gesture Manager をインストールする

  • VCC(VRChat Creator Companion)にて、Gesture Manager をインストールする

2. アニメーションを作成する

  • 全ての 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 型のパラメータ(スプレッドシートに書き出したもの)を追加する
  • 同様にして、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」を制御すると良いということである。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です