Animator Parameters
本書は、UnityのAnimator ControllersおよびAnimation Parametersに関する知識を前提としています。
アバターのPlayable Layersで Animator Parameters を使用することで、アバターの Animator States を制御したり、影響を与えたりすることができます。
- 一部のパラメーターはVRChatに組み込まれており、どの Playable Layer でも使用可能です。
- 独自のカスタムパラメーターを作成することもできます。その場合はExpression Parameters assetを作成する必要があります。
パラメーターは常に変化し得るものとして想定してください。「行き止まり」は避けるようにしましょう。Stateに終了先がない場合、アバターの Animator が正常に動作しなくなる可能性があります。
Built-in Parameters
アバターの Playable Layers に追加することで、VRChat の組み込みアバター用 Animator Parameters にアクセスできます。
これらのパラメーターを追加すると、VRChat 内での状況に応じて値が自動的に更新されます。例えば、VelocityMagnitude パラメーターを追加すると、プレイヤーの現在の速度に基づいてその値が更新されます。
すべての組み込みパラメーターは読み取り専用です。Expressions Menu や OSC を使用して変更することはできません。
以下のリストには、VRChat のすべての組み込みパラメーター、その説明、型、および同期タイプが記載されています。
| 名前 | 説明 | 型 | 同期 |
|---|---|---|---|
IsLocal | アバターをローカルで着用している場合は true、それ以外の場合は false | Bool | None |
| PreviewMode | アバターがプレビュー中の場合は 1、そうでない場合は 0 を返します | Int | None |
| Viseme(口形) | Oculus Viseme(口形)インデックス (0-14)。Jawbone/Jawflap を使用する場合、範囲は音量を示す 0-100 となります | Int | Speech |
Voice | マイク音量 (0.0-1.0) | Float | Speech |
| GestureLeft | 左手操作のジェスチャー (0-7) | Int | IK |
| GestureRight | 右手操作のジェスチャー (0-7) | Int | IK |
GestureLeftWeight | 左アナログトリガー (0.0-1.0)1 | Float | Playable |
GestureRightWeight | 右アナログトリガー (0.0-1.0)1 | Float | Playable |
AngularY | Y軸の角速度 | Float | IK |
VelocityX | 横方向の移動速度 (m/s) | Float | IK |
VelocityY | 垂直方向の移動速度 (m/s) | Float | IK |
VelocityZ | 前後方向の移動速度 (m/s) | Float | IK |
VelocityMagnitude | 速度の合計値 | Float | IK |
Upright | 「直立」度合い。0は伏せ状態、1は完全に直立した状態 | Float | IK |
Grounded | プレイヤーが地面に接地している場合に true | Bool | IK |
Seated | プレイヤーがステーションに座っている場合に true | Bool | IK |
AFK | プレイヤーが離席中(HMD近接センサーまたはEndキーによる)かどうか | Bool | IK |
| TrackingType | 以下の説明を参照 | Int | Playable |
VRMode | ユーザーがVRモードの場合は 1、それ以外の場合は 0 を返します | Int | IK |
MuteSelf | ユーザー自身がミュートしている場合は true、ミュート解除されている場合は false を返します | Bool | Playable |
InStation | ユーザーがステーションに乗っている場合は true、そうでない場合は false を返します。 | Bool | IK |
Earmuffs | ユーザーのEarmuff機能がオンの場合は true、そうでない場合は false を返します。 | Bool | Playable |
IsOnFriendsList | アバターを閲覧しているユーザーが、アバターを着用しているユーザーとフレンドである場合は true を返します。ローカルでは false となります。 | Bool | Other |
| AvatarVersion | アバターがVRChatのSDK3(2020.3.2以降)を使用してビルドされた場合は 3、そうでない場合は 0 を返します。 | Int | IK |
IsAnimatorEnabled | アバターのAnimatorが無効になる1フレーム前に false を返し、有効な場合は true を返します。 | Bool | None |
Avatar Scaling Parameters
アバターのPlayable Layersで以下のパラメータを使用することで、プレイヤーの現在の アバターのスケール に反応させることができます:
| name | 説明 | Type | Sync |
|---|---|---|---|
ScaleModified | アバターのスケール機能を使用してスケーリングされている場合は true、デフォルトサイズの場合は false を返します。 | Bool | Playable |
ScaleFactor | アバターのデフォルトの高さと現在の高さの比率。デフォルトの目の高さが1mのアバターを2mに拡大縮小した場合、2と報告されます。 | Float | Playable |
ScaleFactorInverse | アバターのデフォルトの高さと現在の高さの逆比(1/x)。デフォルトの目の高さが1mのアバターを2mに拡大縮小した場合、0.5と報告されます。極端な値では不正確になる可能性があります。 | Float | Playable |
EyeHeightAsMeters | アバターの目の高さをメートル単位で表したもの。 | Float | Playable |
EyeHeightAsPercent | アバターの目の高さ(メートル単位)と、デフォルトの拡大縮小制限(0.2~5.0)との相対的な比率。2mに拡大縮小されたアバターの場合、(2.0 - 0.2) / (5.0 - 0.2) = 0.375と報告されます。 | Float | Playable |
パラメーターの型
Expression Parametersアセットでは、以下の種類のパラメーターを定義できます。
| パラメーターの型 | 範囲 | パラメーターのメモリ使用量 | 説明 |
|---|---|---|---|
int | 0~255 | 8ビット | 符号なし8ビット整数。 |
float | -1.0 ~ 1.0 | 8ビット | 符号付き8ビット固定小数点数2。 |
bool | True または False | 1ビット |
同期される各パラメーターは、一定量のパラメーターメモリを消費します。VRChatでは最大256ビットまでのカスタムパラメーターを同期可能です。また、アバターには合計8192個までのカスタムExpression Parameters(同期・非同期の合計)という制限があります。組み込みパラメーターは、これらの制限には含まれません。
GestureLeft および GestureRight の値
GestureLeft および GestureRight では、以下の値をそれぞれ使用します:
| インデックス | ジェスチャー |
|---|---|
| 0 | Neutral |
| 1 | Fist |
| 2 | HandOpen |
| 3 | FingerPoint |
| 4 | Victory |
| 5 | RockNRoll |
| 6 | HandGun |
| 7 | ThumbsUp |
Viseme(口形)の値
上から順に Oculus viseme index を使用しており、sil を 0 とします。参考までに以下を参照してください:
| Viseme(口形)パラメーター | Viseme(口形) |
|---|---|
| 0 | sil |
| 1 | pp |
| 2 | ff |
| 3 | th |
| 4 | dd |
| 5 | kk |
| 6 | ch |
| 7 | ss |
| 8 | nn |
| 9 | rr |
| 10 | aa |
| 11 | e |
| 12 | i |
| 13 | o |
| 14 | u |
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 の場合はデスクトップユーザーである可能性があります。 |
| 2 | AV2 でのみ発生するため、AV3 コントローラーを搭載したアバターで長時間この状態になることは想定すべきではありません。SDK3 のステーションでは引き続き発生する可能性があります。 指を含まない、手のみのトラッキングです。これは遷移中の状態でのみ発生します。つまり、 TrackingType は再度変更されると予想されるため、アバターがこの状態にとどまることはありません。 |
| 3 | 頭部と手のトラッキング。VRMode が 1 の場合、このユーザーは3点VRを使用しています。VRMode が 0 の場合、このユーザーはヒューマノイドアバターを使用したデスクトップユーザーです。 |
| 4 | 4点VRユーザー。頭部、両手、腰をトラッキングします。 |
| 5 | 5点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_happy、mood_sad、mood_surprised、mood_angryというブレンドシェイプが含まれている必要があります。
繰り返しになりますが、カスタムのPlayable Layersを設定せずにAvatar 3.0アバターとしてアップロードした場合でも、前述のブレンドシェイプが含まれていれば、組み込みのエモート機能を使用できます。
また、eyes_closedというブレンドシェイプがある場合は、デフォルトのDieエモートを使用したりAFK状態になったりした際に、目が閉じられるようになります。
クロスプラットフォームのパラメーター同期
Quest版とPC版の両方がアップロードされたアバターを使用する場合、パラメーターはパラメーターリスト内の位置と型によって同期されます。パラメーター名では同期されません。PCとQuest間で特定のパラメーターを同期させるには、パラメーターリスト内の位置とパラメーター型が一致している必要があります。
このため、PC版とQuest版のアバターで、たとえ片方のバージョンですべてのパラメーターを使用しない場合であっても、常に同一の Expression Parameters アセットを使用するようにしてください。
パラメーター型の不一致による変換
animator で パラメーター型 を選択する際は、使用しようとしている 組み込みパラメーター または カスタムパラメーター と同じ型を選択することをお勧めします。例えば、VRChat の組み込みパラメーターである AFK を animator で使用する場合は、型として bool を選択するようにしてください。
ただし、パラメーターに型が一致しないものを選択することも可能です。VRChatは、パラメーターの値をAnimatorで使用されている型に変換しようと試みます。例えば、AFKパラメーターにfloat型を選択した場合、VRChatはtrueやfalseの代わりに、AFKを自動的に1.0または0.0として設定します。これにより、AnimatorのBlend TreeでAFKパラメーターを使用することも可能になります。
以下の表は、型が一致しないパラメーターを変換した際にどのように変化するかを示しています。
| ソース型 | Animator型 | 変換の動作 | 例 |
|---|---|---|---|
int | float | 直接floatに変換されます。 | 1 → 1.0 |
int | bool | 0はfalse、それ以外はtrueになります | 1 → true |
float | int | 最も近いintに四捨五入されます(Mathf.Roundと同じ) | 0.5 → 0, 0.6 → 1, 1.5 → 2 |
float | bool | 0.0 は false、それ以外はすべて true | 0.5 → true |
bool | int | true は 1、false は 0 | true → 1 |
bool | float | true は 1.0、false は 0.0 | true → 1.0 |
Trigger 型のパラメーター
現時点では、アニメーションコントローラーで Trigger 型のパラメーターを使用することはお勧めしません。これらの値は、アバターのバージョン間や、リモートクライアントがあなたのアバターを表示している場合、あるいはミラーでアバターを表示するような特別な状況において、同期がずれる可能性があります。アバターの状態を表現する場合は、Int、Float、または Bool 型のパラメーターを使用してください。
同期タイプ
VRChatは、ほとんどの組み込みパラメーターをインスタンス内の他のプレイヤーと同期します。また、独自のカスタムパラメーターについても同期を有効にすることができます。
同期タイプは、VRChatが各パラメーターをどのように同期するかを決定します。パラメーターは以下のいずれかの同期タイプを使用します。
SpeechPlayable- IK
- 頻繁に変更される値を同期するための、より高速な同期モードです。
- 0.1秒ごと(1秒間に10回)に継続的に更新され、リモートユーザーに対してはローカルで
float値を補間します。 - パラメーターによっては、アバターのローカルでレンダリングされたIK状態に基づいて算出される場合もあります。
- None
- このパラメーターは他のプレイヤーと同期されません。
- 例えば、
IsLocalはローカルプレイヤーのアバターでは常に true となり、他のプレイヤーのアバターではfalseとなります。
カスタムパラメーターで同期を有効にする場合、VRChat は通常 Playable 同期タイプを使用します。しかし、Puppet control でパラメーターを操作すると、VRChat は同期タイプを Playable から IK に切り替え、更新レートと滑らかな補間を改善します。Puppet control を閉じると、Playable 同期に戻ります。
脚注
GestureLeftWeightとGestureRightWeightは、トリガーの引き具合に応じて、さまざまなジェスチャーにおいて 0.0 から 1.0 の範囲で変化します。例えば、左手で拳を握ってもトリガーを引いていない場合、GestureLeftは 1 になりますが、GestureLeftWeightは 0.0 となります。トリガーを引き始めると、値は 0.0 から 1.0 に向かって上昇します。これを利用して「アナログ」なジェスチャーを作成したり、さまざまな状態を条件付きで検出したりできます。↩ ↩2リモートで同期される
float値は255段階の値をとることができ、ネットワーク上では1/127の精度を持ちます。また、-1.0、0.0、1.0を正確に保持することが可能です。OSC などを使用してローカルで更新された場合、float 値は Animator 内でネイティブ(32ビット)の浮動小数点値として格納されます。↩
最終更新: