VRChat 非公式日本語ドキュメント

Animator Parameters

caution

本書は、UnityのAnimator ControllersおよびAnimation Parametersに関する知識を前提としています。

アバターのPlayable Layersで Animator Parameters を使用することで、アバターの Animator States を制御したり、影響を与えたりすることができます。

tip

パラメーターは常に変化し得るものとして想定してください。「行き止まり」は避けるようにしましょう。Stateに終了先がない場合、アバターの Animator が正常に動作しなくなる可能性があります。

Built-in Parameters

アバターの Playable Layers に追加することで、VRChat の組み込みアバター用 Animator Parameters にアクセスできます。 これらのパラメーターを追加すると、VRChat 内での状況に応じて値が自動的に更新されます。例えば、VelocityMagnitude パラメーターを追加すると、プレイヤーの現在の速度に基づいてその値が更新されます。

すべての組み込みパラメーターは読み取り専用です。Expressions MenuOSC を使用して変更することはできません。

以下のリストには、VRChat のすべての組み込みパラメーター、その説明、型、および同期タイプが記載されています。

名前説明同期
IsLocalアバターをローカルで着用している場合は true、それ以外の場合は falseBoolNone
PreviewModeアバターがプレビュー中の場合は 1、そうでない場合は 0 を返しますIntNone
Viseme(口形)Oculus Viseme(口形)インデックス (0-14)。Jawbone/Jawflap を使用する場合、範囲は音量を示す 0-100 となりますIntSpeech
Voiceマイク音量 (0.0-1.0)FloatSpeech
GestureLeft左手操作のジェスチャー (0-7)IntIK
GestureRight右手操作のジェスチャー (0-7)IntIK
GestureLeftWeight左アナログトリガー (0.0-1.0)1FloatPlayable
GestureRightWeight右アナログトリガー (0.0-1.0)1FloatPlayable
AngularYY軸の角速度FloatIK
VelocityX横方向の移動速度 (m/s)FloatIK
VelocityY垂直方向の移動速度 (m/s)FloatIK
VelocityZ前後方向の移動速度 (m/s)FloatIK
VelocityMagnitude速度の合計値FloatIK
Upright「直立」度合い。0は伏せ状態、1は完全に直立した状態FloatIK
Groundedプレイヤーが地面に接地している場合に trueBoolIK
Seatedプレイヤーがステーションに座っている場合に trueBoolIK
AFKプレイヤーが離席中(HMD近接センサーまたはEndキーによる)かどうかBoolIK
TrackingType以下の説明を参照IntPlayable
VRModeユーザーがVRモードの場合は 1、それ以外の場合は 0 を返しますIntIK
MuteSelfユーザー自身がミュートしている場合は true、ミュート解除されている場合は false を返しますBoolPlayable
InStationユーザーがステーションに乗っている場合は true、そうでない場合は false を返します。BoolIK
EarmuffsユーザーのEarmuff機能がオンの場合は true、そうでない場合は false を返します。BoolPlayable
IsOnFriendsListアバターを閲覧しているユーザーが、アバターを着用しているユーザーとフレンドである場合は true を返します。ローカルでは false となります。BoolOther
AvatarVersionアバターがVRChatのSDK3(2020.3.2以降)を使用してビルドされた場合は 3、そうでない場合は 0 を返します。IntIK
IsAnimatorEnabledアバターのAnimatorが無効になる1フレーム前に false を返し、有効な場合は true を返します。BoolNone

Avatar Scaling Parameters

アバターのPlayable Layersで以下のパラメータを使用することで、プレイヤーの現在の アバターのスケール に反応させることができます:

name説明TypeSync
ScaleModifiedアバターのスケール機能を使用してスケーリングされている場合は true、デフォルトサイズの場合は false を返します。BoolPlayable
ScaleFactorアバターのデフォルトの高さと現在の高さの比率。デフォルトの目の高さが1mのアバターを2mに拡大縮小した場合、2と報告されます。FloatPlayable
ScaleFactorInverseアバターのデフォルトの高さと現在の高さの逆比(1/x)。デフォルトの目の高さが1mのアバターを2mに拡大縮小した場合、0.5と報告されます。極端な値では不正確になる可能性があります。FloatPlayable
EyeHeightAsMetersアバターの目の高さをメートル単位で表したもの。FloatPlayable
EyeHeightAsPercentアバターの目の高さ(メートル単位)と、デフォルトの拡大縮小制限(0.25.0)との相対的な比率。2mに拡大縮小されたアバターの場合、(2.0 - 0.2) / (5.0 - 0.2) = 0.375と報告されます。FloatPlayable

パラメーターの型

Expression Parametersアセットでは、以下の種類のパラメーターを定義できます。

パラメーターの型範囲パラメーターのメモリ使用量説明
int02558ビット符号なし8ビット整数。
float-1.01.08ビット符号付き8ビット固定小数点数2
boolTrue または False1ビット

同期される各パラメーターは、一定量のパラメーターメモリを消費します。VRChatでは最大256ビットまでのカスタムパラメーターを同期可能です。また、アバターには合計8192個までのカスタムExpression Parameters(同期・非同期の合計)という制限があります。組み込みパラメーターは、これらの制限には含まれません。

GestureLeft および GestureRight の値

GestureLeft および GestureRight では、以下の値をそれぞれ使用します:

インデックスジェスチャー
0Neutral
1Fist
2HandOpen
3FingerPoint
4Victory
5RockNRoll
6HandGun
7ThumbsUp

Viseme(口形)の値

上から順に Oculus viseme index を使用しており、sil を 0 とします。参考までに以下を参照してください:

Viseme(口形)パラメーターViseme(口形)
0sil
1pp
2ff
3th
4dd
5kk
6ch
7ss
8nn
9rr
10aa
11e
12i
13o
14u

AFK State

AFK状態は、以下の操作によってトリガーされます。

  • ユーザーがヘッドセットを外し、HMD近接センサーがヘッドセットを装着していないと判断した場合。
  • システムメニューが開いている場合。これは、使用しているプラットフォームがシステムメニュー表示時にどのようなデータを送信するかに依存します。例えば、Oculus DashはAFKとして登録されませんが、SteamVRのメニューはAFKとして登録されます。これは副次的な現象であり、設計された動作ではありません。
  • ユーザーがEndキーを押して、AFK状態を切り替えた場合。

TrackingType Parameter

TrackingTypeは、いくつかの情報を示しています。

VRModeが1の状態で値が3、4、または6である場合、その値はアバターの着用者が有効にして現在トラッキングしているトラッキングポイントの数を示しています。この値は変化する可能性があります! 6点トラッキング中のユーザーが追加のトラッキングポイントを3つ外すと、値は6から3に変わります。アニメーターを設計する際は、この点を考慮してください。

VRMode が 1 の状態で値が 0、1、または 2 の場合、その値はアバターがまだ初期化中であることを示しています。この値の組み合わせに基づいてアニメーターが分岐するように設計するのではなく、3、4、または 6 といった「有効な」値になるまで待機するようにしてください。

変更への対応

アバターの初期化中、この値は変化する可能性があります!アニメーターが起こり得る変更に対応しており、どの分岐先でも行き止まりにならないようにしてください。

パラメーター説明
0初期化されていません。通常は、ユーザーがアバターを切り替えており、IK がまだ送信されていない場合にのみ発生します。
1ジェネリックリグ。ユーザーは何らかのトラッキングを行っている可能性がありますが、アバターがジェネリックとしてリギングされているため、トラッキングは無視されます。VRMode が 0 の場合はデスクトップユーザーである可能性があります。
2AV2 でのみ発生するため、AV3 コントローラーを搭載したアバターで長時間この状態になることは想定すべきではありません。SDK3 のステーションでは引き続き発生する可能性があります。
指を含まない、手のみのトラッキングです。これは遷移中の状態でのみ発生します。つまり、TrackingType は再度変更されると予想されるため、アバターがこの状態にとどまることはありません。
3頭部と手のトラッキング。VRMode1 の場合、このユーザーは3点VRを使用しています。VRMode0 の場合、このユーザーはヒューマノイドアバターを使用したデスクトップユーザーです。
44点VRユーザー。頭部、両手、腰をトラッキングします。
55点VRユーザー。頭部、両手、両足をトラッキングします。基本的にはフルトラッキングですが、腰は含まれません。
6フルトラッキングVRユーザー。頭部、両手、腰、両足をトラッキングします。

カスタムパラメーター

アバターの Playable Layers で Animator Parameters を使用することで、独自のパラメーターを追加できます。

VRChat 内でパラメーターを制御できるようにするためには、Expression Parameters アセットを作成する必要があります。たとえば、エクスプレッションメニューを設定することで、ユーザーが VRChat 内でアバターをカスタマイズできるようにすることが可能です。

Expression Parameters アセット

Expression Parameters アセットには、Playable Layers で使用できるカスタムパラメーターのリストが含まれています。各パラメーターには name、型、デフォルト値が設定されます。また、パラメーターを他のプレイヤーと同期するかどうかを選択することも可能で、これにより他のプレイヤーは Animator やカスタムパラメーターによって引き起こされた変化を確認できるようになります。

デフォルトのエクスプレッションパラメーターの状態。

ヒント

Expression Parametersアセットの作成方法については、Expressions Menuのドキュメントを参照してください。

カスタムパラメーターを制御する方法

アバターのPlayable LayersおよびExpression Parametersアセットでカスタムパラメーターを設定した後、以下の3つの方法で制御できます。

  • Expressions Menuを設定すると、VRChat内で衣装の切り替えやカスタムアニメーションの再生といったパラメーターを簡単に操作できるようになります。Expressions Menuは、カスタムパラメーターを制御する最も簡単で一般的な方法です。
  • Playable Layer内のステートにステートビヘイビアであるAvatar Parameter Driverをアタッチできます。これにより、Expression Parametersアセットで定義したパラメーターを自動的に設定、加算、またはランダム化することが可能です。
  • アバターをOSCに対応させることで、ユーザーやサードパーティ製ツールからパラメーターを制御できるようになります。例えば、VRCFaceTrackingでは、顔や目のトラッキング機器を使用してアバターの表情パラメーターを操作します。

Default AV3 Aliasing

VRChatのAV3テンプレートコントローラーでは、独自のコントローラーを一から構築したくない場合に利用できる「デフォルト」がいくつか用意されています。これらはエイリアシング(別名設定)によって処理されるため、(同じ名前を付けない限り)独自の設定と競合することはありません。

特に、Default ActionレイヤーとFXレイヤーではエイリアシングが使用されています。これらのレイヤーに含まれるExpressionの使用について、特に気にする必要はありません。

Actionでは、VRCEmoteという名前のエイリアスされたパラメーターが使用されます。これは1から16の範囲を持つInt型です。

FXでは、独自のメニューで利用できるようにVRCFaceBlendH (-1,1) および VRCFaceBlendV (-1,1) というエイリアスされたFloat型のAnimator Parametersを使用しています。デフォルトのFXレイヤーを使用するには、Bodyという名称のSkinned Meshに、mood_happymood_sadmood_surprisedmood_angryというブレンドシェイプが含まれている必要があります。

繰り返しになりますが、カスタムのPlayable Layersを設定せずにAvatar 3.0アバターとしてアップロードした場合でも、前述のブレンドシェイプが含まれていれば、組み込みのエモート機能を使用できます。

また、eyes_closedというブレンドシェイプがある場合は、デフォルトのDieエモートを使用したりAFK状態になったりした際に、目が閉じられるようになります。

クロスプラットフォームのパラメーター同期

Quest版とPC版の両方がアップロードされたアバターを使用する場合、パラメーターはパラメーターリスト内の位置と型によって同期されます。パラメーター名では同期されません。PCとQuest間で特定のパラメーターを同期させるには、パラメーターリスト内の位置とパラメーター型が一致している必要があります。

このため、PC版とQuest版のアバターで、たとえ片方のバージョンですべてのパラメーターを使用しない場合であっても、常に同一の Expression Parameters アセットを使用するようにしてください。

パラメーター型の不一致による変換

animatorパラメーター型 を選択する際は、使用しようとしている 組み込みパラメーター または カスタムパラメーター と同じ型を選択することをお勧めします。例えば、VRChat の組み込みパラメーターである AFKanimator で使用する場合は、型として bool を選択するようにしてください。

ただし、パラメーターに型が一致しないものを選択することも可能です。VRChatは、パラメーターの値をAnimatorで使用されている型に変換しようと試みます。例えば、AFKパラメーターにfloat型を選択した場合、VRChatはtruefalseの代わりに、AFKを自動的に1.0または0.0として設定します。これにより、AnimatorのBlend TreeAFKパラメーターを使用することも可能になります。

以下の表は、型が一致しないパラメーターを変換した際にどのように変化するかを示しています。

ソース型Animator型変換の動作
intfloat直接floatに変換されます。11.0
intbool0false、それ以外はtrueになります1true
floatint最も近いintに四捨五入されます(Mathf.Roundと同じ)0.50, 0.61, 1.52
floatbool0.0false、それ以外はすべて true0.5true
boolinttrue1false0true1
boolfloattrue1.0false0.0true1.0

Trigger 型のパラメーター

現時点では、アニメーションコントローラーで Trigger 型のパラメーターを使用することはお勧めしません。これらの値は、アバターのバージョン間や、リモートクライアントがあなたのアバターを表示している場合、あるいはミラーでアバターを表示するような特別な状況において、同期がずれる可能性があります。アバターの状態を表現する場合は、Int、Float、または Bool 型のパラメーターを使用してください。

同期タイプ

VRChatは、ほとんどの組み込みパラメーターをインスタンス内の他のプレイヤーと同期します。また、独自のカスタムパラメーターについても同期を有効にすることができます。

同期タイプは、VRChatが各パラメーターをどのように同期するかを決定します。パラメーターは以下のいずれかの同期タイプを使用します。

  • Speech
  • Playable
  • IK
    • 頻繁に変更される値を同期するための、より高速な同期モードです。
    • 0.1秒ごと(1秒間に10回)に継続的に更新され、リモートユーザーに対してはローカルで float 値を補間します。
    • パラメーターによっては、アバターのローカルでレンダリングされたIK状態に基づいて算出される場合もあります。
  • None
    • このパラメーターは他のプレイヤーと同期されません。
    • 例えば、IsLocal はローカルプレイヤーのアバターでは常に true となり、他のプレイヤーのアバターでは false となります。

カスタムパラメーターで同期を有効にする場合、VRChat は通常 Playable 同期タイプを使用します。しかし、Puppet control でパラメーターを操作すると、VRChat は同期タイプを Playable から IK に切り替え、更新レートと滑らかな補間を改善します。Puppet control を閉じると、Playable 同期に戻ります。

脚注

  1. GestureLeftWeightGestureRightWeight は、トリガーの引き具合に応じて、さまざまなジェスチャーにおいて 0.0 から 1.0 の範囲で変化します。例えば、左手で拳を握ってもトリガーを引いていない場合、GestureLeft は 1 になりますが、GestureLeftWeight は 0.0 となります。トリガーを引き始めると、値は 0.0 から 1.0 に向かって上昇します。これを利用して「アナログ」なジェスチャーを作成したり、さまざまな状態を条件付きで検出したりできます。 2

  2. リモートで同期される float 値は255段階の値をとることができ、ネットワーク上では 1/127 の精度を持ちます。また、-1.00.01.0 を正確に保持することが可能です。OSC などを使用してローカルで更新された場合、float 値は Animator 内でネイティブ(32ビット)の浮動小数点値として格納されます。

最終更新: