VRChat : OSC についての知見とメモ
なんか公式のドキュメントは最低限のことしか書いてないので、VRChat上でOSCを扱ううえで知っておいたほうがいいことを備忘録として書き残しておきます。
OSCの送受信
OSCは「クライアント」と「サーバ」という概念があり、クライアントは送信する側、サーバは受信する側です。
VRChatはアバターの現在の状況の値(移動やジャンプなど)を送り、ユーザはアバターの変更したい値(Avatar Parametersなど)を送信するという形です。
また、送信先はコンピュータのUDPポートです。
OSCのアドレス指定は一定
これはOSCが「アドレス+パラメータ」で構成されているため、VRChatではこのアドレスを基に変更するパラメータを指定します。
逆に言ってしまえば、アドレスを間違えるとVRChatはOSCを無視します。 またOSCはhttpに似たアドレス構成になっており、VRChatで扱うパラメータは「int」「bool」「float」のみです。
追記:2022年12月時点でChatBoxへのOSC対応(Unicode)がされたので、現在では扱えるパラメータは「int」「bool」「float」「string」になります。
VRChat アドレス一覧
/avatar/change
ローカルにてアバターが変更されると送信されるようです。
/avatar/parameters/[name]
アバターに設定されたパラメータの内、ユーザーが変更可能なパラメータを変更できます。[name]にはAvatar Parametersにて指定した名前や、デフォルトパラメータ名が入ります。
/avatar/parameters/VRCEmote
intを送信するとデフォルトEmoteが再生されます。
/input/[Name]
ユーザーが変更可能なもので、アバターに依存しない値を変更します。(移動、ジャンプ、視点移動、マイクミュートなど)[name]には特定のパラメータ名が入ります。
また以上のアドレスはVRChatからの送信にも使用されるようです。
OSCを扱うツール
VRChat公式が内部で検証済みのツールを公開しています。ここにあるものなら確実に動作するはず。
OSC Core (C#)
VRChat設計のブランチがあるようです。
python-osc (Python)
VRChat公式が検証済み。確実に動作するらしい。
TouchOSC , Protokol
公式おすすめのOSCツール。
起動オプション
Steamのプロパティにて、起動オプションの設定ができます。
送信ポート [9001]
受信ポート [9000]
送信先IP [127.0.0.1]
デフォルトの値はこちらですが、この値を任意に変更できます。
--osc=inPort:senderIP:outPort
例) --osc=9000:127.0.0.1:9001
inPortは受信ポート、senderIPは送信先IP、outPortは送信ポートです。
OSC制御用ファイルの存在(重要)
OSCを有効化した状態でアバターを着替えると、特定のディレクトリ以下にファイルが生成されます。
C:\Users\[PCのユーザ名]\AppData\LocalLow\VRChat\VRChat\OSC\[ユーザーID]\Avatars\[アバターID].json
ここに生成されたファイルは、生成以降更新されることはありません。
つまり、後からパラメータを追加してアップデートをかけたとしても、ここのファイルは変更されません。
さらにややこしいことに、VRChatはOSCを扱う際、このファイルを参照して使用します。
OSCを送信しても反映されないなどの問題が起きた場合、これが原因の可能性が高いです。
対策は、アバターに着替える前に、ファイルを削除して再生成するのみです。再生成すればその時点のパラメータでまた再認識されます。
送信から反映までの時間
これは体感になってしまいますが。
まずOSC送信からローカルの反映に遅延はありません。
ですが、同じパラメータを何度も書き換える場合(同じアドレスにOSCを何度も送る場合)、0.2~0.3秒以下の送信だと反映されないようです。
この場合更新速度は最低でも1秒以上にしたほうが良いと思います。
またローカルからグローバルへの反映ですが、通信状況にもよりますが2~長くて5秒ほどの遅延が発生します。
現在時刻を表示するギミックや、時間にシビアなギミックのトリガーがOSCの場合、影響が出る場合があるかもしれません。
デバッグウインドウの知見
VRChat上で表示できるOSCデバッグウインドウですが、あの表示は受信したOSCのパラメータに基づく表示をするため、見かけ上変な表示をする問題があります。
例)intで送っているのにboolの表示がされる(OSCではboolは0,1で判断するため)
なので、表示ではなくパラメータを見て反映できているか見るのがお勧めです。
floatの反映
floatはローカルとグローバルで反映される値がだいぶ違い、ギミックによっては全く違う挙動を起こすことがあるので注意が必要です。(これはOSCだけでなくAvatar Parameterでも同じことが起こります。
またOSCが送信できるfloatの桁には制限がありませんが、VRChatで正確に反映できるのはせいぜい小数点第二位までのようです。
(滑らかに値を変更する用途なら影響は少ないようです)
それ以下の細かい値は誤差が大きくまともに使えない可能性が大きいので、floatで正確な値を使用したい場合は小数点第二位までにしておきましょう。(小数点第二位でも誤差がでます(0.55→0.5499999999など))