» VR開発メモトップへ

VRChatメモ

最終更新日:2022年05月18日

VRChatのTipsをメモしていく場所です(基本的にUdonSharpベースになりそうです)。

更新履歴

(2022年5月18日)「最小限のワールドの作り方」にVRChat Creator Companion(ベータ版)を使用する方法を追加
(2022年2月21日)「OSCのメモ」を追加
(2022年2月16日)UdonSharpのリンクを更新
(2022年2月1日)Udonの実行速度とCyanEmuについて追記
(2022年1月30日)「椅子を作るには」「プレイヤーの操作を取得するには」を追加、項目の順番を整理


ワールド制作のメモ

VRChatではUnity 2019.4.31で制作したシーンをワールドとしてアップロードできます。

ワールドの公開に必要な手順

ワールドをアップロードできるようにする

VRChatにはTrust Rankという仕組みがあり、ユーザーのランクがVRChatのプレイ時間や、制作したコンテンツの量、フレンドの人数その他によって上がっていきます。ワールドやアバターをアップロードするには、Trust Rankを初期状態のVisitorからひとつ上のNew Userに上げる必要があります。基準は明確にされていませんが、アカウントを作成して数時間から十数時間程度プレイするとNew Userに上がるようです。

Community Labs

VRChatのワールドにはCommunity Labsという仕組みがあります。SDKを使用してワールドをアップロードするとまずCommunity Labsに行った状態になり、そこで特に問題が報告されずワールドが一定時間プレイされると自動的にパブリック(公開状態)になります。まずCommunity Labsにアップロードして、ワールドの名前やURLをSNS等で知らせてプレイしてもらうことによってパブリック化を促すことになります。

Community Labsのワールドは、SettingsでShow Community Labsをチェックするとワールド検索で出てくるようになります。

最小限のワールドの作り方

SDKを使用してワールドをアップロードする手順(概略)は以下の通りです。

なお、ワールドごとにUnityのプロジェクトを一緒にするか分けるかについて、VRChat公式は「分けることを強く推奨」としています。が、ケースバイケースだと思います。

従来の方法

  • Unity 2019.4.31で3Dテンプレート(ビルトインレンダリングパイプライン)で新規プロジェクトを作成する
  • VRChatのユーザーページ(要アカウント作成)からSDK3 - Worldをダウンロードしてインポート
  • シーンにPlaneを配置する
  • シーンにVRCWorldプレハブを配置する
  • スポーンポイント(ワールドに入ったときにプレイヤーが登場する場所)を設置する。空ゲームオブジェクトを配置して、VRCWorldプレハブのVRC Scene DescriptorのSpawnsに登録する
  • VRChat SDK > Show Control Panel > Builderを開いて、Setup Layers for VRChatボタンとSet Collision Matrixボタンを押す
  • Build & Testボタンを押すと実際にVRChatで動作チェックできる
  • ワールドをアップロードするには、Build & Publishボタンを押して、Gameウィンドウにワールド名、Player Capacity(ワールドの参加者数上限)、サムネイル等を入力してUploadボタンを押す

VRChat Creator Companion(ベータ版)を使用する方法

VRChatの開発サポートソフトウェアであるVRChat Creator Companionのベータ版が公開されています。VRChatのアバター・ワールド制作のためのUnityプロジェクトを手軽に作成できます。

VRChat Creator CompanionはVRChatのユーザーページ(要アカウント作成)からダウンロードしてインストールします。起動して左のProjects > Newをクリックするとテンプレートの選択画面になります。

World(Udonを使用する場合はUdonSharp)をクリック、プロジェクト名を入力してCreateをクリックするとワールド制作用のUnityプロジェクトが作成されます。

VRChat SDK - Worlds/{バージョン}/UdonExampleSceneフォルダを開くとサンプルシーンがあります。

VRChat SDK > Show Control Panel > Builderを開いてBuild & Publishボタンを押すとGameウィンドウにワールドの設定画面が出てくるので、ワールド名、Player Capacity(ワールドの参加者数上限)、サムネイル等を入力してUploadボタンを押します。

VRChat Creator Companionではほかに左タブから各種ドキュメントを参照したり、VRChatをいろんなオプションで起動するVRChat Quick Launcherを呼び出すことができます。

ワールドで使用できるコンポーネント

VRChatのワールドでは、以下のホワイトリストに載っているUnityおよびUnity外のコンポーネントのみを使用できます。

Unity外のコンポーネントでは、Dynamic Bone、Final IK、AVPro、Oculus Spatializer等を使用できます(Dynamic Boneは今後PhysBonesにリプレイスされるようです)。

ワールドの参加者数上限について

Player Capacityでワールドの参加者数上限を設定しますが、この数値はゆるやかな上限値(soft cap)になります。インスタンスの参加者数が設定した値を越えると、参加者のフレンドのみがjoinできるようになります。参加者がPlayer capacityの2倍になるとフレンドもjoinできなくなりますが、例外として、ワールドの制作者とインスタンスを立てた人のみは引き続きjoinできます。

参加者が増えるとアバターの描画負荷で非常に重くなるので、重いワールドではPlayer capacityを低めに設定します。

ワールドをローカルでテストする

VRChat SDKウィンドウのBuilderタブで、Build & TestをクリックするとワールドをビルドしてVRChatクライアント上でテストできます。さらに、Number of Clientsを0にして「Build & Reload」するとVRChatを起動したままでワールドが更新されます。

マルチプレイヤーのテストをする場合は、Number of Clientsを2以上にして、Force Non-VRをオンにすると複数のクライアントをデスクトップモードで起動できます。デスクトップモードではマウス操作がカメラ移動に奪われてしまいますが、Windowsキーあたりを押すと別のクライアントに移動しやすいです。

マルチプレイヤーのテストの際、同じIPアドレスからだと2~3人しか入れないという話があり注意が必要です。

Questで遊べるようにするには

Quest版のワールドもアップロードする必要があります。Switch Build Target To AndroidでビルドターゲットをAndroidに切り替えて(初回はすべてのアセットの再インポートで時間がかかるので注意してください)、Build and Publish for Androidをクリックします。

Questではワールドの容量は100MBまでです。おそらくテクスチャが容量の大部分を占めるので、テクスチャのインポート設定を細かく調整するとよさそうです。

その他

プレイヤーのカメラ設定を変更したい場合(ニア・ファークリップを調整したり、ポストエフェクトを使用する等)は、カメラを作成してReference Cameraを設定します。

ゲームワールド(ゲームをプレイすることが第一の目的であるワールド)をアップロードする場合は「game」タグをつけるといいようです。

Udonについて

UdonはVRChat独自のビジュアルプログラミング言語で、Udon Node Graphで記述します。Udon Node GraphはバイトコードのUdon Assemblyにコンパイルされ、UdonのVMで実行されます。

Assets/VRChat Exapmles/UdonExampleSceneシーンにUdonのサンプルがいろいろ入っています。Udon BehaviourコンポーネントのOpen Udon Graphボタンを押すとノードグラフが開きます。

また、Assets/Udon/ReferenceDocsにリファレンスドキュメントが入っています。

Udonを使用して制作したものは#MadeWithUdonハッシュタグでツイートするのがおすすめとのことです。

UdonSharpについて

UdonSharpMerlin氏が開発したオープンソースソフトウェアで、C#コードをUdon Assemblyにコンパイルします。これを使用するとノードベースではなくC#でUdonを書くことができます。ただし、標準のC#と異なりさまざまな制限事項があります。

UdonSharpを使用するには、SDK3 - WORLDをインポートしたのち、GitHubのUdonSharpのリリースページからunitypackageをダウンロードしてインポートします。

UdonSharpでは、MonoBehaviourではなくUdonSharpBehaviourを継承したクラスを使用します。また、Udon C# Program Assetを作成し、Udon C# Program Assetの中から.csファイルを参照する必要があります。

新規スクリプトを追加する場合は、Projectウィンドウで右クリックでCreate > U# ScriptするとUdon C# Program Assetと.csの両方のアセットが作られますので、その後Udon Behaviorコンポーネントを作成してUdon C# Program Assetをアタッチするのが簡単だと思います。

なお、パフォーマンスに関して、UdonはC#より200倍から1000倍遅いので注意とのことです。また、UdonSharpBehaviourはMonoBehaviorを継承していますので、ゲームオブジェクトにアタッチすると通常のC#コードとして実行できます(VRChatでは動きません)。

Udonのデバッグについて

Build & Testでの実行時に右Shift+半角/全角+3でログウィンドウが開閉します(英語キーボードでは半角/全角の代わりに「`」キーを使用します)。各種イベントやDebug.Log等の出力が表示されます。

右Shift+半角/全角+8で、ネットワークオブジェクトの上にGameObjectの名前、ネットワークID、Ping値、パケット到達率、オーナーがオーバーレイ表示されます。

右Shift+半角/全角+6で、ネットワークオブジェクトの一覧が表示されます。

ワールドのテストを簡単にするCyanEmuというオープンソースソフトウェアがあります。インポートすると、Unity上でエディタを再生するだけで歩きまわったりUdonのデバッグをしたりできます。

椅子を作るには

「Sit」をポイントしてトリガーを引くと座れる場所を作るには、VRC_Stationを使用します。Assets/VRChat Examples/Prefabs/VRCChair/VRCChair3プレハブが実際のサンプルになっていますので、これをシーンに設置してテンプレートとして使用できます。

動作の詳細としては、VRC Stationと同じゲームオブジェクトにアタッチされているColliderの領域をポイントすると「Sit」メッセージが表示され、VRC Stationの子のメッシュが水色のアウトラインで光ります。トリガーを引くかマウスを左クリックするとInteractイベントが発動してUdonで座ります。

VRC Stationに座ると、アバターの通常の動きやネットワーク位置同期が無視され、アバターがVRC Stationの子として動くようになります。

  • 乗り物の椅子にする場合はPlayer MobilityをImmobilize For Vehicleに変更します。
  • デフォルトでは座った状態で移動すると椅子から降りるようになっていますが、Disable Station Exitでこれを無効化できます。
  • 座ったときの位置、降りたときの位置をPlayer Enter Location、Player Exit Locationで設定します。
  • API Objectについてはよく分かりません。

VRCChair3プレハブにはUdonとしてStationGraphがアタッチされていて、Interactイベントでプレイヤーが座り、OnStationEntered / OnStationExitedイベントでプレイヤー名を表示するようになっています。UdonSharpでこのあたりの処理を書きたい場合は、以下のようになります。

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

public class Seat : UdonSharpBehaviour
{
    public override void Interact()
    {
        Debug.Log("Interact");
        Networking.LocalPlayer.UseAttachedStation();
    }

    public override void OnStationEntered()
    {
        Debug.Log("OnStationEntered");
    }

    public override void OnStationExited()
    {
        Debug.Log("OnStationExited");
    }
}

次の方法でも乗り降りができます。Disable Station Exitがオンの場合は、プレイヤーの操作で降りられるようにする必要があり、下記の例ではジャンプボタンで降りるようにしています。

public class Seat : UdonSharpBehaviour
{
    [SerializeField] VRCStation vrcStation;
    
    public override void Interact()
    {
        vrcStation.UseStation(Networking.LocalPlayer);
    }

    public override void InputJump(bool value, UdonInputEventArgs args)
    {
        vrcStation.ExitStation(Networking.LocalPlayer);
    }
}

なお、OnStationEntered / OnStationExitedイベントは誰かが座ると全プレイヤーで発動するようです。

アバターにVRC_Stationを仕込むことも可能なようです(まだ試していない)。

プレイヤーの操作を取得するには

Input Eventsを使用して、共通化されたVRコントローラー、キーボード、マウスの入力を取得できます。UdonSharpだと下記の要領になります。

using UdonSharp;
using UnityEngine;
using VRC.Udon.Common;

public class InputTest : UdonSharpBehaviour
{
    public override void InputJump(bool value, UdonInputEventArgs args)
    {
        Debug.Log("Jump: " + value);
    }

    public override void InputUse(bool value, UdonInputEventArgs args)
    {
        Debug.Log("Use: " + value + " " + args.handType);
    }

    public override void InputGrab(bool value, UdonInputEventArgs args)
    {
        Debug.Log("Grab: " + value + " " + args.handType);
    }

    public override void InputDrop(bool value, UdonInputEventArgs args)
    {
        Debug.Log("Drop: " + value + " " + args.handType);
    }

    public override void InputMoveHorizontal(float value, UdonInputEventArgs args)
    {
        Debug.Log("MoveHorizontal: " + value);
    }

    public override void InputMoveVertical(float value, UdonInputEventArgs args)
    {
        Debug.Log("MoveVertical: " + value);
    }
}

用途のひとつとして、VRC_Stationに座った状態でこの方法で入力を取得することで乗り物を動かしたりできます。

また、Input.GetKey / GetKeyDown / GetKeyUpメソッドでキーボードの入力も可能です。VRモードで使用できませんので、利用するシーンは限られてくると思います。

ネットワーク同期について

公式ドキュメントでは下記ページに解説があります。

デフォルトでは移動するオブジェクトはネットワーク同期されておらず、ワールドに入ったプレイヤーにはそれぞれ別の場所に見えている状態になっています。

VRC Object Syncコンポーネントをアタッチすると、オブジェクトの位置が同期されます。具体的には、Transform(Position、Rotation、Scale)とRigidbodyのプロパティのいくらかが同期されます。

ネットワーク同期される各オブジェクトには「オーナー」という概念があります。オーナーとなるプレイヤーがオブジェクトの状態に責任を持ち、状態を更新すると他のプレイヤーに同期されます。

典型的なシナリオを一つ示すと、たとえばプレイヤーAがボールが拾って投げたとき、ボールを拾ったタイミングでボールのオーナーがプレイヤーAになり、投げたボールの物理シミュレーションがプレイヤーAのPCで実行されます。飛んでいるボールの座標がネットワークを経由して他のプレイヤーのPCに逐次(座標の補間等をしつつ)コピーされます。プレイヤーBがボールをキャッチするとオーナーがプレイヤーBに移ります。

ネットワーク通信にはどうしても物理的な遅延があるため(光ファイバーで光速の約3分の2)、すべてのプレイヤーが同じ瞬間に同じ状態の世界を見ることはできないのですが、上記のような処理をすることで、ボールに直接触るプレイヤーにはボールの動きがラグなく見えており、他のプレイヤーには不自然ではない程度にその動きが反映されるという状態が実現されます。

オーナーがいないネットワークオブジェクトは「マスタークライアント」が制御します。VRChatでは、最初にワールドのインスタンスに入ったプレイヤーがマスタークライアントになり、マスタークライアントがログアウトしたり他のインスタンスに移動していなくなると、他の誰かがマスタークライアントの役割を引き継ぎます。

インスタンスから誰もいなくなると、すべてのネットワークオブジェクトの状態がロストします。誰かが新しいインスタンスを立ててマスタークライアントになると、すべてのネットワークオブジェクトが初期状態に戻っています。

VRC Object SyncはデフォルトでAllow Collision Ownership Transferがオンになっていて、オブジェクトに接触するとオーナーが移動するようになっています(が、あまり当てにしないほうがいいとの話あり)。これをオフにして手動でオーナーシップを取得する場合はUdonSharpで下記のようにします。

Networking.SetOwner(Networking.LocalPlayer, gameObject);

ネットワーク同期については下記ページが詳しいです。

MIDI入力について

VRC Midi Listenerコンポーネントを使用することで、入力したMIDIメッセージをUdonで受信できます。PCにMIDIキーボード等を接続するほか、外界の出来事をMIDIメッセージに変換することで、ワールド内に情報として送信できます。

Quest対応について

Questの制限事項について

下記ページにQuestでの制限事項についてまとめられています。

ビデオ再生、ポストエフェクト、Dynamic Bone等が使えないので注意が必要です。

Questでのパフォーマンス最適化について

下記ページにQuestでの最適化についてまとめられています。

Questできちんとパフォーマンスを出すためには考慮する必要のあることはたくさんありますが(あとでいろいろ書くかも)、まずは計測する必要があります。

パフォーマンス計測に一番簡単に使えるツールとして、Oculus公式のOVR Metrics Toolがあります。QuestにOVR Metrics Toolをインストールして有効にすると、ヘッドセットの中でCPU・GPU使用率が確認できるようになります。「Unity + Oculus Quest 2 開発メモ」の「パフォーマンス最適化に使用できるツール」を参照してください。

また、Questのようなモバイル機のGPUでは一般にフラグメントシェーダーの負荷の影響が大きいです。フラグメントシェーダーが重いマテリアルで画面の広範囲を覆うと(たとえば地面や空、オブジェクトに近づいたとき等)、毎フレームたくさんのピクセルを重い計算をして塗りつぶさないといけないため覿面に重くなります。

これに対処するため、VRChatのSDKには軽量なシェーダーが一通り用意されており、VRChat/Mobileに入っています。Standardシェーダーの代わりにStandard Liteを使う、スカイボックスはSkyboxを使う、そして可能ならライトマップを焼いてLightmappedを使うのがよさそうです。

Questでの容量最適化について

テクスチャのインポート設定でAndroidのタブでOverride for Androidをチェックすると、PC版とQuest版でサイズやテクスチャフォーマットを変更することができます。ライトマップテクスチャについてもこの設定が可能です。

アバター作成のメモ

すでに情報がたくさんありますので、詳しいところはお任せで! 最低限のメモです。

Quest対応について

下記のページの制限をクリアする必要があります。

QuestではPoorやVery Poorのアバターはデフォルトで表示されないため、Medium以上にする必要があります。Mediumの基準は、15000ポリゴン以下、Skinned MeshとMeshがそれぞれ2つ以下、マテリアル2個まで、Animatorは1個まで、ボーンは150個までとなっています。パーティクルは使用できません。また、VRChat/mobileのシェーダーを使用する必要があります。

既存のPCアバターのQuest版をアップロードする場合は同じIDを設定します。VRChat SDKウィンドウのContent Managerタブで既存のアバターのIDをCopy IDで取得して、VRC Avatar Descriptorの下にアタッチされているPipeline ManagerのBlueprint IDに入力してAttachしてからBuild & Publishします。

VRoid StudioでQuest対応アバターを作るTips

VRoid Studio正式版のアバターをQuestに対応させる場合の最低限のTipsです。

ポリゴン数について、VRMエクスポート時に「ポリゴンの削減」で形が崩れない程度に削減度を上げます。また、肌マスクで服の下のメッシュをできるだけ削除するとポリゴン数を大きく減らせます。

「マテリアルの削減」でマテリアル数を2にします。

マテリアルをMToonからVRoid/mobile/ToonLit等に変更する必要がありますが、カットアウトが使えないので眉毛や服の表示がおかしくなってしまいます。VRoid Studioでまゆげ、アイライン、まつげのテクスチャのレイヤーを削除して(こうすることでVRMエクスポートの「透明メッシュを削除する」で削除されるようになります)、肌のテクスチャにまゆげ、アイライン、まつげを描き込むことで対処できます(これを簡単に行うツールがあるようです)。

服もカットアウトを使用していることが多く、どうにかする必要があります(ふんわりした表現)。

アクションメニューで再生するExpressionを作成するには

メニューボタン長押しまたはRキー長押しで表示される円形のアクションメニューからアニメーションを再生できます。

  • VRC Avatar DescriptorのPlayable Layersで適当なレイヤーのAnimator Controllerをオーバーライドする
  • Animatorウィンドウで任意のParameterを登録し、それによって動作するアニメーションのステートを作成する(詳しくはUnityのドキュメントを)
  • ProjectウィンドウでCreate > VRChat > Avatars > Expression ParametersとExpressions Menuを作成して、VRC Avatar DescriptorのExpressionsに割り当てる
  • Expression ParametersアセットにAnimator Parameterを登録して、Expression Menuアセットでメニューコントロールを登録する

Playable Layersについて、人外の尻尾や耳等はAdditiveレイヤーではなくGestureレイヤーを、アバター本体とは関係ないGameObjectの有効化・無効化、シェーダーアニメーション、パーティクルシステム等はすべてFXレイヤーを使用することとされています。

OSCのメモ

OSC(OpenSound Control)は電子楽器や音響機器をリアルタイム制御するための通信プロトコルです(が、実際には音楽分野以外でも結構使われています)。

VRChatには、この通信プロトコルを使用して外部のソフトウェアから自分のアバターを制御したり、自分のアバターの状態を外部のソフトウェアで取得する仕組みがあります。以下のような応用例を確認しています。

VRChatはUDPの9000番ポートでOSCメッセージの受信、9001番ポートで送信を行います。VRChatからLAN上の他のデバイスに送信するには --osc=9000:192.168.1.100:9001 のようにオプションでIPアドレスを指定して起動します。

OSCを有効にするには

アクションメニュー(メニューボタン長押しまたはRキー長押し)でOptions > OSC > Enabledで有効にします。

また、Options > OSC > OSC Debugでデバッグ画面が開き、受信したOSCメッセージが以下のようにグラフィカルに表示されます。OSC Debugを開いた場合もOSCが有効になります。

とりあえずVRChatにOSCメッセージを送ってみる

OSCの送信テストツールとしてTouchOSCが紹介されています。TouchOSC公式トップページの下のほうからWindowsデスクトップ版をインストールします。

起動してEdit > ConnectionsでVRChatのポート番号(9000番と9001番)を設定します。

TouchOSCでは、自分でボタン等のUIを作成してどのようなOSCメッセージを送るか設定することができます。ゼロからUIを作成しようとすると結構癖があって戸惑うのですが、VRChat公式がサンプルとして用意しているvrc-input.toscが参考になります。こちらを読み込んで、ツールバーの再生ボタンを押し、マウスで操作してVRChat側でアバターが移動・ジャンプすることを確認してください。

下のOSCタブを有効にすると送信・受信しているOSCメッセージが表示されます。アバターからどのようなメッセージが外部に送信されるかも把握できます。

OSCでアバターを操作するには

OSCメッセージでキーボードやゲームパッド等と同じように操作のメッセージを送ることができます(これがvrc-input.toscで送ったOSCメッセージでした)。例えば /input/Jump を送るとジャンプします。

下記ページに軸とボタンの一覧があります。Supported Inputsのところに折りたたまれています。

OSCでAnimator Parameterを操作するには

OSCメッセージでAnimator Parameterを操作することができます。

まず、アバターを使用すると C:¥Users¥[ユーザー名]¥AppData¥LocalLow¥VRChat¥VRChat¥OSC フォルダにOSCの設定ファイル(.json)が存在しない場合に新しく生成されます。これを書き換えることで、OSCのアドレスとAnimator Parameterを結びつけます。

例えば以下のように書き換えると、アドレス /avatar/parameters/Test にOSCメッセージを送ると「アクションメニューで再生するExpressionを作成するには」で登録した「Test」Animator Parameterが操作されます。

{
  "id": "avtr_{アバターID}",
  "name": "{アバター名}",
  "parameters": [
    {
      "name": "Test",
      "input": {
        "address": "/avatar/parameters/Test",
        "type": "Bool"
      }
    },

使用できる型(type)はInt、Float、Boolのみです。

OSCを送信するソフトウェアを作成するには

ドキュメントでは以下の2つが紹介されています。

  • OscCore(Unity) - VRChat自体にも使用されているライブラリ
  • python-osc(Python)

また、音声認識でOSCメッセージを送信するソフトウェアが制作されています。

VRChatのしくみ

公開情報から推測するVRChatのしくみです。

アーキテクチャ

ネットワーク同期はExit Games社のPhotonで、ボイスチャットもPhoton VoicePhoton Industriesを使っているようです(「Unity ネットワーク技術メモ」を参照)。

クライアントについてはUnityの機能をほぼそのままラップして露出していて、UnityのAPIがほぼ1対1でUdonで使える感じです。ワールドもAssetBundleをそのまま使っています。Unityは今ビルトインの描画パイプラインを廃止してSRPに移行しようとしていますが、アバター・ワールドを全移行しないといけないので苦労しそうな予感がします(Unityを使っている他のVRプラットフォームも同様)。

その他サーバーサイドについては以下の求人から使ってる技術スタックがなんとなく見えてきそうです。

Server Engineer — VRChat

  • Have experience with using cloud providers at scale, such as AWS or Google Cloud
  • Be able to work in a variety of languages, especially Node.js, Python and C#

Web Frontend Engineer — VRChat

  • Have a demonstrable understanding of best practices for single-page web apps, especially with React and Redux

VRChat社について

以下、あくまで想像です。

VRChat社は2014年創業のスタートアップ企業で、従業員は2021年時点でおそらく30~40名ほど。ラウンドを重ねて2021年6月にシリーズDで約80億円の資金調達をしています。収入源はおそらくサブスクリプションのVRChat Plusと商業使用契約の収益がメインと思われますが、運営コストをどれほどペイできているかは疑問です。が、過去の資金調達の実績から、都度バーンレートが倍増したとしてざっくり8年くらいは現状のままでもサービスの維持が可能なのではと予想。その間にマネタイズの方法を見つけるか、どこか大きい会社がバイアウトする感じでしょうか。最近の風潮だと赤字のままIPOということもありそうです。

Photonが結構高いのと、大容量のワールドがガンガンアップロードされているので(AWSだと1GBのダウンロードに10円かかります。もっと安価な配信方法もありますが)、インフラ費用が大変そう。実際のところはよく分からないです。

ひとまず短・中期的にVRChatというサービスがどうにかなることはなさそうなイメージでしょうか(個人的見解)。

VRChatのトラブルシューティング

VRChatを安定して起動して楽しめるようになるまでにいろいろはまったので、書き残しておくと誰かの役に立つかもしれないと思ってメモです。

起動しても人がいない

SteamでVRChatをアップデートしてください。VRChatのバージョンが上がったときに、過去のバージョンと互換性がなくなりネットワーク同期ができなくなることがあります(「世界線が変わった」とよく言われています)。

コントローラーが反応しない・左手と右手の操作がおかしくなる

SteamVRを起動していない状態からVRChatを起動するとおかしくなることがあるようです。SteamVRを起動してからVRChatを起動すると安定します。

「バインドが見つかりません」と出てコントローラーが使用できない

「バインドが見つかりません」「入力バインドの読み込みに失敗しました」「Steamを利用できません。一部の機能が無効の可能性があります」といったエラーが出てコントローラーが使用できず、「バインドの新規作成」を押しても反応しない場合があります。

Steamが起動していないとこの状態になります。Steamを起動してログインしている状態でSteamVRを起動してください。

上の項目とあわせると、Steamを起動する→SteamVRを起動する→VRChatを起動する、という順番になります。

VRChatのサイトからLaunchボタンを押しても起動しない

WindowsのURIスキームの設定が壊れている可能性があります。

レジストリのHKEY_CLASSES_ROOT\VRChat\shell\open\commandが設定されているか、パスが正しいかを確認します(Steam版とOculus版のVRChatをインストールしていて、別の場所のVRChatを実行していたことがありました)。おそらく以下のようになっていると思います(2021年9月現在)。

"[VRChatのパス]\VRChat\launch.exe" "%1" %*

なお、以前はlaunch.batを実行していたのですが、最近のアップデートでlaunch.exeに変更になっているようです。

VRChatのサイトから起動したときにロードが始まらない

起動中の空間のまま何も進まなくなることがあります。

ワールドのページ(https://vrchat.com/home/world/*)を開いて、下のNew InstanceでFriends等を選んでLaunch、Launch Worldを押すと上手くいくかもしれません。Public Linkで開いたページからLaunch Worldするとなぜかロードが始まりません。

ユーザーデータを初期化したい

ワールドやアバター等のキャッシュは

C:\Users\[ユーザー名]\AppData\LocalLow\VRChat\VRChat

ユーザー設定はレジストリの

HKEY_CURRENT_USER\SOFTWARE\VRChat

に保存されています。どうしようもなくなったときは削除すると復旧できる場合があります(ユーザーデータの削除はログインのし直しになることに注意)。

VRChatのTips

スクリーンショットを綺麗に撮りたい

見ている風景を直で撮ったり、UIを撮影したりしたい場合は、ウィンドウをアクティブにしてCtrl+F12で4K(3840x2160)のスクリーンショットが撮れます。アンチエイリアスがかからないようで、画像処理ソフトで1920x1080に縮小すると綺麗になります。

撮影した画像はカメラ同様C:\Users\[ユーザー名]\Pictures\VRChatに保存されます。

利用規約について

DeepLあたりにでもかけてざっと一読しておくのがおすすめです。

Terms of Service — VRChat

  • ユーザーは13歳以上でなければならず、18歳未満は親または後見人の同意が必要
  • VRChat社との商業使用契約なしで商業利用することはできない 等

SDK License — VRChat

  • SDKのアセットをVRChat以外で使用してはいけない
  • リバースエンジニアリングの禁止 等

Community Guidelines — VRChat

その他

下記ページが非常に詳しいです。

以下φ(..)メモメモ中

書いた人:こりん(@korinVR
» VR開発メモトップへ