Oculus Rift・HTC vive対応ゲーム『VRchat』のwikiです。ここでは基本説明と自作アバターの追加方法などを載せていきます。



概要

このページでは従来のハンドジェスチャーを使った表情変更をAV3.0で再現する方法を紹介します。
前提としてAV3.0アバターをアップロードできる知識を想定しています。

AV3.0ではアバターのアニメーションをUnityのAnimator Controllerで制御できます。
これによりVRChatの内部変数を使ったアニメーションの発動・条件分岐などが比較的容易に実装できるようになりました。
ここではVRChatで使われるハンドジェスチャー用の内部変数を利用してアバターの表情を制御します。

手順

1.準備

Unityのシーン上で3DモデルにAvatar Descriptorコンポーネントを設定してアバターとしてアップロードできる状態にしておく。
(参考:アバター導入 3.0以降

2.表情Animationの作成

  • AV2.0と同様に1フレーム分の表情アニメーションを用意する。
  • ついでに、適当なBlend Shapesを0にするなどして無表情のアニメーションも別クリップとして用意しておく。
    • AV3.0ではハンドジェスチャーを上書きしないので、表情クリップの中で手の形を再現しなくてもOK。
    • 逆に指を動かしたくない場合は別の作業が必要。(後述)

3.Animator Controllerの作成

  • Projectウィンドウを右クリック→Createで新規のAnimator Controllerを作成する。
  • 作成したControllerを開き、左上のPrametersからハンドジェスチャー用の変数(GestureLeft, GestureRight)をintで追加する。

  • 左上のLayersから新規レイヤーを追加する。
    • 名前は何でもOK。ここでは左手で制御したいのでLeftHandとする。
  • 歯車マークからLeftHandのWeightを1にする。

  • LeftHandレイヤーを選択し右側のEntry, Exit等がある画面へ2で作成した無表情アニメーションをドラッグする。
    • このとき無表情のStateが作成され、EntryからのTransition(矢印)が自動的に付与される。
  • 同様に他の表情アニメーションのStateも追加する。
    • 2つ目以降のStateはEntryから矢印は伸びない。
  • Any Stateを右クリック→Make Transitionで矢印を出し、各表情のStateにつなぐ。

  • Any Stateから伸びた各矢印をクリックし、InspectorからConditions(アニメーションの開始条件)を入力する。
    • 例えば、左手を握り込んだとき(Fist)に表情を出す場合は、ConditionsをGestureLeft Equals 1とする。
    • 無表情への遷移はConditionsをGestureLeft Equals 0にする。
      • こうすると、左手のハンドジェスチャーを切った状態(Neutral)で無表情に戻る。


以上で左手で表情を制御できるようになる。
右手でも制御したい場合は、同じControllerに右手用のレイヤーを追加するところから繰り返す。

4.モデルへの適用

  • Avarat DescriptorのFXレイヤーに作成したAnimator Controllerを追加してアップロードする。
    • ここではAnimator ControllerをFXという名称にしている。


手のアニメーションを無効化したい

アニメーション発生時に指を動かしたくない場合、上記の操作とは別に手のアニメーションを無効化する必要がある。
すべてハンドジェスチャーを無効化したいなら、とりあえずモデルのAvatar Descriptor→Playable Layers→Base→GestureレイヤーをNoneにすればOK。


一部のハンドジェスチャーだけ無効化したい場合、デフォルトのControllerを改造してGestureレイヤーに割り当てる。
  • デフォルトのハンドジェスチャー用のAnimator Controller「vrc_AvatarV3HandsLayer」を複製する。
  • 左手と右手のアニメーションがそれぞれLeftHand, RightHandレイヤーに割り当てられているので、それぞれ編集する。
    • 各ハンドジェスチャーがStateとして存在しているので、該当のStateを削除すればOK。
  • 編集したControllerをAvatar DescripterのGestureレイヤーに割り当てる。

どなたでも編集できます