VRCで外部通信を行う方法には大きく以下の2つがある

  • VRC_Panorama
  • OSC
  • Udon

OSCはUDPかつローカルでの使用が多いらしいので、使えるAPIはVRC_Panoramaに限られてくる

2023/07/20追記 VRC_PanoramaはSDK2にある機能で、現在主流のSDK3では扱うことが出来ない。 しかし、SDK3のVideoPlayerを使うことで、扱うコンテンツは動画になるが似たような機能を使うことが出来る。

現時点(2023/07/20)では外部通信の方法として最も有力なのはUdonらしい。自分は宗教的な事情で特定のエディタしか使えないので、ここではUdonSharpについては書いていく。UdonSharp(U )

VRC_Panorama

VRC_Panoramaとは、本来パノラマ(ワールド内の景色)を表示するための機能。 ただ、任意のURLにアクセスして画像リソースを取得できるという特徴を利用して、外部のWeb APIを叩くことが出来る。

ザックリとした仕様

  • 本来はワールドのパノラマ画像を表示させるための機能
  • URLは決め打ち 一応動的に指定させる方法がある
  • 画像が取得できないと指定されたURLへのアクセスを継続する ref: 別に画像を返さなくても良い

どのくらいの頻度なのか気になる

別に画像を返さなくても良い

そして処理した後、404エラーを返しています。このようにすることでVRC_Panoramaにはテクスチャが設定されず、 次回以降も再度問い合わせてくれます(一度テクスチャを読み込めると二度と読み込まない) ここは404である必要はありません。200でも、テクスチャになる画像を返さなければ良いです。 例えばVRC_Panoramaだけでなく別のアプリからも同じようにトリガーしたいのであれば、404ではなく200にしてOK等の 文字列を返す方が親切かと思います。

あえて画像を返さないことで、VRC_Panoramaからのアクセスを継続させることが出来る。

また、?以外が来たとき、例えばhttp://localhost:61221/image.png等の通常のURLアクセスを行った場合は exeと同じフォルダにあるwwwフォルダの中身を返すようになっていますので、www/image.png等を置けば VRC_Panoramaに普通にテクスチャ画像を返すことも可能です。

また画像を返すことで本来の機能である画像を表示させることも可能

ref: VRChatからVRC_Panoramaを使いESP-WROOM-02経由で外部機器を操作する

UdonSharp(U#)

VRChatのノードプログラミング言語UdonのアセンブリにコンパイルできるC#ベースのプログラミング言語

構文はまんまC#だけど、処理系はC#では無いのでC#と比べて色々制約がある1

U#を使って外部と通信するにはVRCStringDownloaderを使う。 ドキュメントにある通り、この関数にはURLUdonBehaviourという引数が必要。 Jsのfetchみたいにサーバーにデータを投げるのは厳しそうなので、QueryParameterとかで何とかする必要がありそう。

前述したVRCStringDownloaderは、文字通りStringをDownloadするためのものなので、text/plane以外のレスポンスボディは受け付けてくれなさそう。(要検証) 公式ドキュメントの下にはIVRCStringDownloadという似た名前の関数があるけど、これはVRCStringDownloaderの戻り値になる。もし何らかのエラーが発生してテキストが取得できなかったら、このエラーメッセージなどを大体として表示させるのが良さそう。

Footnotes

  1. C#で出来ないことはU#でも出来ないし、なんならC#より制約があるとかなんとか。メモリ管理にGCを使っているらしいので、GCされるデータ型を極力使わないなどの対策も必要そう文字列型がGCされるのでFPSガタ落ちワールドしか作れる気がしない ref: [【VRChat】 Udon開発する上での注意点【Unity】](https://qiita.com/toRisouP/items/16bd06aa303a1bb1a747