Programming in VRChat

VRChat でのプログラミングについて調べたことの書き溜め

ワールド管理の仕組みと用語

2018/2/18 追記: instance type の説明Invite+Invite Only に誤りがありました。打ち消し線で取り消して修正しています。


ワールドの生成の仕組みと用語が「プログラマには意味が分かるが普通には馴染みのないだろう表現」で書かれていて分かりにくそうなので、用語の整理と仕組みの解説をしてみようと思います。

注意:

  • 公式のまとまった説明がないために、推測交じりに、色々な説明断片を寄せ集めた内容になっています。このため間違っている可能性があります。
  • 将来のバージョンでは仕様が変更になる可能性があります。確認は(2018/2 現在最新の 0.12.0p12 で行いました)
  • ユーザー(プレイヤー)向けの使い方説明ではなく、 「どういう仕組みになっているのか」の情報整理を重視して書いています。

f:id:naqtn:20180213170421p:plain:w400 f:id:naqtn:20180213170437p:plain:w400

データ関連の用語

  • bluerint (ブループリント)
    • ワールドの元データのこと。
    • ワールド作成者が Unity を使って作っているのはこれ。
    • (言葉自体としては建築業界などでの青焼き設計図のこと。昔そういう方式の紙原稿のコピー機があったのです)
  • ID
    • 特定のデータの塊を指定するための値
    • 実際の値は wrld_48cf80e6-15dd-4c17-8667-c5dc01baa5cb というような形式
  • instanceインスタンス
    • Bluerint から作られ、実際にプレイに使われるワールド(のデータ)のこと。
  • author (作者)
    • ワールドの blueprint を作った人。
    • いわゆる「ワールドの作者」
  • owner (所有者)
    • インスタンスを生成したプレイヤー
    • いわゆる「ワールドを開いた人」
  • publish
    • (ワールドの)データを公表・公開すること。
    • publish すると publish status は public になり、そのワールドは検索での検知対象になる。
    • 法的な決めごと https://vrchat.com/legal においても publish の性質は定められている。
      • アップロード者に義務が生じる内容になっている。 (要は他人を害するダメなことはすんなよという趣旨)
    • 具体的な値は以下
      • Public
        • public 申請して運営のチェックを通った状態
      • Unlisted
        • public 申請していない、いわゆるプライベートワールド
      • (「申請中」とか「public から外れた」はあるのだろうか?)

プレイヤー行動の用語

  • join
  • invite
    • 自分が今居るワールドインスタンスに「他の人を招待する」という行動。
    • invite を受け取った人はそれを受け入れると、そのワールドに移動する。
  • request (invite request)
    • 他プレイヤーに対して invite してもらうように、要求すること

instance type / アクセス制限の用語

  • instance type
    • 生成された個々のワールドのインスタンスに付く性質。
    • join と invite の実行可否の決め方の種類。
  • 具体的な値は以下(以下の文の "you" はこれからインスタンスを生成しようとしているプレイヤーのこと。)(この仕様は今後変更されうるかもと予告されている)

    • Public
      • "Anyone can join."
      • 制限なく誰でも join できる
    • Friends+
      • "Any friend of a user in the instance may join."
      • インスタンスに既に居るプレイヤーのフレンドは join できる。
    • Friends
      • "Only your friends may join."
      • ワールドを開始した owner のフレンドのみが join できる
      • (join する人から見た時に、owner がフレンドなのであれば操作時に join 指定する相手は owner でなくてもよい。 0.12.0p12 から 2018/2/17 追記)
    • Invite+
      • "You can invite others. Joiners can accept requests."
      • invite できるのは owner だけ。
      • インスタンスに既に居るプレイヤーは、フレンドから invite request は受け取ることは出来る。
      • 口頭で owner にプレイヤー名を伝えて invite してもらう、という運用を想定している。
      • owner と参加者は invite request を承認することで、それぞれのフレンドを呼べる(2018/2/17修正)
    • Invite Only
      • "You can invite others. Only you can accept requests"
      • (UI 上の表示表記は "invite" であることもある模様)
      • invite できるのは owner だけ。
      • invite request を受け、許可できるのも owner だけ。
        • invite request を送った人は直接的に owner を認知している。既にフレンドなのかもしれないし、今検索で知ったのかもしれないが。
      • インスタンスに既に居るプレイヤーは invite request の知らせ(notification)を受けることは出来るが、参加許可はできない (2018/2/17 追記)
        • 口頭で owner にプレイヤー名を伝えて invite してもらう、という運用を想定している。
  • どういうことだってばよ:

    • Public:存在を知れたら誰でも入りうる プレイヤーの検索から join して誰でも入りうる
    • Friends+:「友達の友達の友達…」がjoinするので、実質知らない人がいる状態になる
    • Friends:ownerにとっては全員が友達。少なくとも owner は参加者が誰なのか知っている
    • Invite+:Friends+の「リクエストを承認してもらった人に承認してもらった人に…」と少し限定されるけど… リクエスト方法はさておき owner が全ての参加承認をしている
    • Invite Only:ownerが呼んだ人のみ(inviteかリクエスト承認) ownerが呼んだか、ownerを知り直接リクエストできた人だけになる
  • デフォルトの instance type
    • 指定しなかった場合には次のルールになる模様
    • publish status が public である場合: public
    • それ以外: Invite Only

補足

「public なワールド」

  • 「public」という表現には、二つの異なる意味がある。
  • 一つはインスタンスに対するもので、instance type のうち「誰でも入れる」の意味の「public」
  • もう一つは bluerint に対するもので、 「ワールドを作成したので皆に体験してもらおう」と「public 申請する」ないしは「public 化する」という時の、 「公表された」という意味での「public」
  • 後者は単に(bluerint が)検索の対象であるかどうかを意味しているだけで、 そこには「誰でも入れるか否か」の制限は関係しない。データの利用自体は誰でも出来る。
  • 例:publicになっていない作成中のワールドIDを教えて他の人に体験してもらうことは出来る
  • 例:ID を知っていれば誰でも owner に成れる。そこに author が知らない人を join させることも可能。
  • 例:一度 invite してもらえれば後からいくらでも再訪問できる。

  • 脱線:

    • アバターにもこの「設計図とそれの利用」という二段構造がある。
    • 現在実装では、ID さえわかってしまえば他の人が作ったアバターも使用できる。
    • アバターを勝手に使われてしまうというごたごたの要因の一つはこれ。

ポータルでの扱い

  • UI操作からドロップするポータルは instance type を設定できる。つまりインスタンスを特定している。
  • ワールドに配置する VRC_PortalMaker には ID だけが指定でき、インスタンスを制御する機能はない。
    • だれかが利用するとインスタンスが確定する(ようだ)。
    • (表示が変わる。シャープ記号の後の数字がインスタンスを特定する番号と思われ)
  • (0.12.0p11 のリリースノートに "Fixed issue where static portals didn't take users to the same instance." とあるので、おそらく短時間の間は特定のインスタンスを指しているのではないか。)

owner 自身の振る舞い

  • owner がワールドから抜けても owner ではあり続ける。誰かが代わるというようなことはない。
  • invite で開いたそのワールドの owner は、そこから一度抜けると自分自身も join できない。
  • owner からの invite request に関しては Invite+ の動きをするようだ。(なんで?詳細仕様不明)

  • 日本語の「ワールドを作った人」という表現は author(blueprint 作者)Owner(instance 生成者) のどちらを指しているか曖昧になってしまうので避けた方が良さげ。
  • non-public の意味で「private world」(プライベート)という表現がされることがあるが、用語としては存在しないようだ。
  • ドキュメントによっては「Room」と書いてあるものもあるが、「world」と呼ばれているものとおそらく同じ。(たぶん)
  • https://vrchat.com/legal で publish するものは固有名詞「User Content」と書いてあり、ワールドには限らないように書かれている。
  • invite 関係の UI での言葉の表現はメール(手紙)を模しているので、送り主の文面として読む。命令形は送り主からの受け手対する「こうしてくれ」という要求ないしは指示として読む。(ここ、ちょっと分かりにくいように思う。システムからの指示のように理解しようとすると意味が分からなくなる)

関連記事

  • Launch URL ワールドのIDを指定して起動する方法。(これで検索にかからない publish されていないワールドへ行くことができる。)
  • vrchat launcher 何度も訪れるようならば、ここで紹介したツールに登録すると便利(なはず)