2018年07月29日

VRChat固定インスタンス間移動システム(VRC World Jumper)の設置方法

VRC World Jumper


jmpA.png

この記事を試す前に、下記の対策も試してみてください。(併せると効果高くなります)

ワールドのカメラのカリング距離調整と、同期頻度調整
http://gpsnmeajp.sblo.jp/article/184044375.html

*概要
VRChatはまだ未発展のサービスということもあり、1つのワールドに20人以上集まると段々と重くなってきます。
しかし、ワールドの部屋単位たるインスタンスは、基本個人に紐付いて生成されるため、
publicではないインスタンスでは、フレンド同士でないと移動が難しくなります。

ワールドに設置したポータルは、インスタンスを指定できないため、
時に違うインスタンスに移動してしまったりします。

ここでは、WebpanelのGoToRoomを使った「固定のインスタンス間の移動」を
行う仕組みをワールドに実装する方法をご説明します。

お試し用ワールド
https://vrchat.net/launch?worldId=wrld_30da4670-55de-4633-a2e3-b6d34ab1b5b1

*注意
この方法はVRChat公式の方法からは外れた方法です。
公式から提供されている機能を利用していますが、未保証な機能です。(理由はページ末へ)
将来的に使用できなくなる可能性があります。

この手法を用いたことによる損害等の責任は一切持ちません。
vrcjmp.zip内のコードに関してはCC0とします。

*よりシンプルな作例のご紹介
がとーしょこら(@gatosyocora)様がunitypackageでよりシンプルな形態のものを配布されています。
こちらもご検討ください。
https://twitter.com/gatosyocora/status/1022125633671843840

*作り方
1. 以下のファイルをダウンロードし、展開します。
https://sabowl.sakura.ne.jp/gpsnmeajp/tool/vrcjmp.zip
v1.0 2018-07-29 公開
v1.1 2018-07-29 構造の改良と色付け
v1.2 2018-07-29 nonceの修正

2. vrcjmp.htmの中身を書き換えます。
「wrld_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx」を、自分のワールドのIDに置き換えてください。
別の部分を巻き添えで消さないように注意してください。1文字でも欠けると動きません。
jmp1.png
ワールドのIDは、Unityの「VRChat SDK」の「Manage Uploaded Content」からコピーできます。
(まだ一度もpublishしていないワールドはコピーできません。一度publishしてください)
jmp2.png

3. webフォルダを作り、その中にvrcjmp.htmを配置します。
jmp3_1.png

jmp3_2.png

jmp3_3.png

4. ワールドにWebpanelを設置します。
まずそのためのQuadを設置します。位置は自由です。
Scale はX : Y が 2 : 1 になるように設定してください
(例ではX=1, Y=0.5にしています)
jmp4.png

jmp5.png

QuadにVRC_Web Panelをセットします。
jmp6.png

設定はまず以下のようにします。特に赤枠に注意してください。
(赤枠以外も変更していますので、なるべく同じ状態にしてください)
jmp7.png

次に、vrcjmp.htmを読み込むように設定します。
jmp8.png

最終的に以下のようになればOKです。
jmp9.png

*ワールド内での使い方
ワールドに入ると以下のように表示されます。クリックすると、指定されたFriend+のインスタンスに飛びます。
これは固定化されており、誰がクリックしても同じROOMは同じインスタンスに飛びます。
(なお、このルームの数や種類はvrcjmp.htmを編集することで変更できます。)
jmpA.png
最初にワールドを開いた人は、そこは固定されたインスタンスではないため、
まずどれかのROOMをクリックして移動しておくことをおすすめします。

*ちなみに
HTMLをカスタマイズするとこういう画像を使ったものや、ボタンを増やしたものもできます。また、違うワールド同士を固定のインスタンスで接続したりもできます。

パスワード入力して正しいときだけ特定のワールドに飛んだり、オリジナルのポータルを通ってワールド間を往来したり、時刻によって飛び先が変わったり、そんなことも多分できます。

やってみたいけどやり方わからない、という方は、簡単なものであればお作りできますので、お気軽にページ下部のコメントでお問い合わせください。
問い合わせの際にはdiscordかtwitterのIDを添えてください。

例えば、城ワールドと飛空艇ワールドと迷宮ワールドを行き来できるようになったり
jmpB.png
パスワード認証したり(http://gpsnmeajp.sblo.jp/article/184045837.html )
jmpD.png

なお、設置の仕方がわからないという問い合わせは受け付けかねます。

設置してみたけどうまく動作しない場合は、上記の手順をしっかり読み直して、
可能であればまっさらなワールドに設置してみて、それでもダメ場合は
配布HTMLの不具合等の可能性がありますので、お問い合わせください。

*メモ
・セキュリティを向上させたい場合はnonceを書き換えてください。
・他のワールドのWorldIDを指定すると、他のワールドの固定インスタンスに飛ぶことができます。
 (相互に設置し合うと、行って帰ってくることができるようになります)
・スクリプトや外部サーバーを組み合わせるとかなりいろいろなことができます。
・負荷の都合上おすすめしませんが... その場にいる全員を違うワールドにふっとばすこともできなくはないようです。
・VRC_Triggerから発動もできるはずなので、斬られると天国に飛ばされるとかも、できなくはない
 →Triggerからの発動についてはがとーしょこらさんの仕組みのほうが単純で良いと思われる。

*書式
ユーザーIDあり
Public
wrld_xxxx:0000~public(usr_yyyy)
Friends+
wrld_xxxx:0000~hidden(usr_yyyy)~nonce(zzzz)
Friends
wrld_xxxx:0000~friends(usr_yyyy)~nonce(zzzz)
Invite+
wrld_xxxx:0000~private(usr_yyyy)~canRequestInvite()~nonce(zzzz)
Invite Only
wrld_xxxx:0000~private(usr_yyyy)~nonce(zzzz)
wrld_xxxx:0000~private(inviteurl_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)というパターンも?

ユーザーIDなし
Public
wrld_xxxx:0000~public
Friends+
wrld_xxxx:0000~hidden~nonce(zzzz)
Friends(実質Closed?)
wrld_xxxx:0000~friends~nonce(zzzz)
Invite+
wrld_xxxx:0000~private~canRequestInvite()~nonce(zzzz)
Invite Only(実質Closed?)
wrld_xxxx:0000~private~nonce(zzzz)

VRChat ワールド一覧 - beta のURL生成機能を参考にさせていただきました。
http://teruaki-tsubokura.com/vrchat/

なおこのインスタンスに関する法則性は起動時のワールド指定でも有効です。
(ワールドIDのみだとInvite Onlyで起動しますが、Publicに飛んだりできる)
Launch URL - Programming in VRChat
http://vrcprog.hatenablog.jp/entry/tips-Launch_URL

*「公式から提供されている機能を利用していますが、未保証な機能です」について
この機能は、VRChatのWebPanelに搭載されているJavascript API bindingsのGotoRoom機能を利用しています。この機能含め、Javascript API bindingsはマニュアルには乗っておらず、実際殆どが機能しません。GotoRoom機能は数少ない動作している機能の一つです。

UnityでVRC_Web Panelを設置して、ローカルのファイルを指定すると以下のような表示が現れます。

jmpC.png

以下意訳
「Javascript API bindingsを呼び出すには、engine.call('メソッド名',...)を使ってね。これはPromiseライクなオブジェクトを返すよ」
「ListBindings()を呼び出すと、利用可能なAPIを確認することができるよ」
「ページが読み込み完了してAPIが使えるようになったらonBindingsReadyイベントが発生するからlistenしてね」
(注: GotoRoomは単純な機能なのでonBindingsReadyイベントをチェックする必要はほぼ無いです)

というわけで、どうやらワールド製作者が利用することを最初から意図しているようです。
が、未完成なのでマニュアルに乗ってないものと推測されます。
posted by gpsnmeajp at 04:04| Comment(0) | TrackBack(0) | トラブル解決
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/184041906
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック