見出し画像

【VRChat】VRCHandMenuをちょっとだけカスタムしてみよう!(動画プレイヤー編)※24x08x24更新


はじめに

みなさんこんにちは、VRChat楽しんでますか?

VRゴーグルを被って動画プレイヤーでなにかを見るのって結構楽しいですよね。動画自体はスマホとかパソコンで簡単に見れちゃいますが、VRゴーグルを被って動画を見るとなんだか特別感があります。

VRChatで使える動画プレイヤーは結構種類があって、iwaSync3やKineL式VideoPlayer、海外だとProTVなどが有名でしょうか。さらに最近だとYamaPlayerやVizVidなどが増えて選択肢が凄い広がりましたね。

私も最初の頃はiwaSync3やKineL式VideoPlayerを使っていましたが、YamaPlayerが出てからはずっとYamaPlayerを使っています。デザインとか機能性が好きなんですよね。

YamaPlayerは同作者さん制作のVRCHandMenuと連携させることができます。VRCHandMenuはプレイヤーの手元に多機能メニューを召喚して、そこから入退室ログを見たりアラームを設定したりナイトモードを有効化したりペンを出したり色々とすることができます。さらにYamaPlayerと連携することで動画プレイヤーの操作もできるようになります。

VRCHandMenuはとても便利なギミックですが、私は少し不満がありました。実はVRCHandMenuは初期状態だと1つの動画プレイヤーしか操作することができないんですよね。なのでYamaPlayer(A)とYamaPlayer(B)の2つのYamaPlayerがあったときに、VRCHandMenuからは事前に設定したYamaPlayer(A)かYamaPlayer(B)のどちらかしか操作することができないのです。私はワールド内に複数の動画プレイヤーを設置することが多いので少し不便に感じていました。

VRCHandMenuから複数のYamaPlayerを操作できるようにする方法って何かないかなーと思って試行錯誤していたんですが、思っていたよりも簡単にできる方法があったので今回の記事で共有していきたいと思います。

前回の記事と同じで今回も我流での実装になるのでより効率的な方法があるかもしれません、っていうかあると思います。私が試した範囲では大きなバグには遭遇しませんでしたが、人によってはバグが発生するかもしれません。バックアップをとった上で自己責任でお願いします。

複数のYamaPlayerを操作できるようにする

私が作ったワールドだと以下のワールドでこの機能を実装しています。

準備

まずYamaPlayerとVRCHandMenuをUnityのプロジェクトにインポートして、ヒエラルキー上に設置してください。今回は2つのYamaPlayerを操作できるようにしたいので、ヒエラルキー上に設置するYamaPlayerは2つ必要です。

この時、プレハブはアンパック(展開?)しておいた方がいいかもしれません。ギミックをアプデした時に設定がリセットされることがあったりするので…。私はそれでYamaPlayerのプレイリストが消し飛んだことがあります。

手順①

VRCHandMenuを開くと以下のようになっていると思います。

この中のMenuObjectからCanvas、DetailCanvas、Pagesまで開いていきます。そうすると以下のような画面になると思います。

この中からVideoHandle、VideoPlayer、VideoPlayList、VideoPlayListDetailの4つのオブジェクトを右クリックで複製します。

「複製」から複製する
(1)の付いている方が複製されたもの

「複製」から同時にオブジェクトを複製した場合、新規に複製されたもの(ここでは(1)が付いているもの)同士で自動で参照してくれるようになります。

(1)がついているものを参照している

VideoHandleとVideoHandle(1)内の設定をしていきます。VideoHandleはYamaPlayerに対応する部分ですね。

VideoHandleにはUI Controllerというスクリプトが設定されています。UI Controller内のコントローラー(Controller)の項目にYamaPlayer内のControllerを入れてあげればVRCHandMenuからYamaPlayerを操作できるようになります。VideoHandleには1個目のYamaPlayerを、VideoHandle(1)には2個目のYamaPlayerを設定してあげましょう。

YamaPlayer側のController

これでYamaPlayerを操作する内部側の準備ができました。

手順②

YamaPlayerを操作する内部側の準備はできましたが、外部側、つまりUIの設定はまだ終わっていません。

デフォルトでは無効化されているDetailCanvasとToolsMenuオブジェクトを有効化します。最後に再び無効化するので忘れないように注意してください。

ToolsMenuオブジェクトはその名の通りVRCHandMenuのメニュー部分です。

Hierarchy上のLabelはその名の通りラベルですね。VRCHandMenu側で「ツール」と書かれているところがLabelに対応した部分です。文字を変えたければLabel下のTextをいじれば文字を変えれます。

Hierarchy上のRowは行でRowは1行目、Row(1)は2行目ですね。1行目にJointログ、アラーム、睡眠関係のメニューがあって、2行目にペン、スイッチ、動画プレイヤーがあります。

Hierarchy上のメニュー
実際に表示されるメニュー

このLabelとRow、そしてRow下のオブジェクトはある程度自由に動かすことができます。

とりあえず以下のようにしてみましょう。ここでは新しくLabel(1)とRow(2)を作成しています。Row(2)にはVideoPlayerとVideoPlayer(1)があります。VideoPlayerはRow(1)から持ってきてもので、VideoPlayer(1)はそれを複製したものです。

Label(1)は「動画プレイヤー」
Row(2)はVideoPlayerとVideoPlayer(1)

VideoPlayer(1)はVideoPlayerを複製しただけで参照元が変わっていないので、TargetPageをVideoPlayerからVideoPlayer(1)に設定し直してあげます。

これでやることは終わりですが、最初に書いた通りDetailCanvasとToolsMenuを再び無効化しておいてくださいね。

ここ忘れがち

確認

これでVRCHandMenuから複数のYamaPlayerを操作する準備ができました。TestBuildして動作チェックをしてみてください。正常に動いたら喜びましょう!正常に動かなかったらどっかで何かをミスっているか私の文章が間違ってるかどっちかです!一応新規のシーンでテストしているので大丈夫だとは思うのですが…。

ここでなんでClientSimじゃなくてTestBuildなのかって思う人もいると思います。TestBuildするよりもClientSimで確認した方が早いですからね。

これはおま環なのかわからないんですが、ClientSimだとYamaPlayerとVRCHandMenuの両方が正常に動作しなくなっちゃうんですよね。YamaPlayerは動画が読み込みエラーになっちゃうし、VRCHandMenuは開けないし。TestBuildすると正常に動きますし、他作者の3人称視点ギミックとかもバグったりするので私の環境のClientSimがバグってるっぽいんですよね。みなさんの環境で正常に動くならClientSimでもいいと思います。

追記(24x08x24)

いつのアップデートで仕様が変わったのかはわからないのですが、現在は上記の方法だけだといくつか問題が発生するため、追加の作業が必要となります。

まず、現在は上記の方法だけだとVRCHandMenu側で動画の映像が共有されなくなっています。

これはUnity上の画像だが、VRCにアップロードしても白い画面のままになる

これを回避するためには、YamaPlayer本体の方でスクリーンを追加する作業をする必要があります。YamaPlayerの「設定」を開き、一番下の「スクリーン」の項目を見てください。「+」ボタンを押すことで、スクリーンを追加するための項目が出現します。

いつの間にかUIがすごく変わっていたYamaPlayerくん

「なし(オブジェクト)」のところにはVRCHandMenu側のMenuObject/DetailCanvas/VideoPlayer/Screen/RawImageを選択してあげます。これがVRCHandMenu側で動画の映像を流す部分です。

これでVRCHandMenu側でもYamaPlayerの映像が流れるようになったと思います。

さて、これはおま環かもしれませんが、私の環境だとVRCHandMenu側のプレイリストの表示が崩壊するバグが起こります。

これ自体は以前にこの記事を書いていた時にも私の一部のワールドで発生していたのですが、最新バージョンになっても同じ現象が起きてしまったので解決策を書いておきます。

解決策といっても凄いシンプルで、初期状態では非表示状態になっているVRCHandMenu側の「DetailCanvas」という項目を表示状態にするだけで解決します。ちなみに理由はわかりません。なんか直ります。



エリアごとに操作できるYamaPlayerを切り替える

導入

ここからはおまけかつ応用です。

上の例では2つのYamaPlayerをVRCHandMenuから操作できるようにしましたね。ですが、遠くのエリアにあるYanaPlayerを常に操作できるのも問題があったりします。

例えばメインルームとスリープルームの2つにYamaPlayerを設置して、その両方をVRCHandMenuで操作できるようにしていたらどうでしょうか。誰かがメインルームと間違えてスリープルームのYamaPlayerでノリノリ爆音音楽を流してしまう事故も起こりそうです。スリープルームに部屋ロック機能が付いていた場合、なおさらスリープルーム外の人にYamaPlayerを操作されたくないですよね。

下のワールドは私が以前に作ったワールドなのですが、

このワールドは合計で4つのロケーションがあって、その全てのロケーションにYamaPlayerを設置しています。これらを全てVRCHandMenuで操作できるようにしていたら、プレイヤー側も使いづらいですし操作ミスが多発しそうです。

全部表示するとこうなる

なのでエリアごとに操作できるYamaPlayerを切り替えてあげる必要があります。

手順

やり方は凄い単純です。OnPlayerTriggerEnterとかOnPlayerTriggerStayとかを使って、エリアAに入ったらエリアA用のVideoPlayerを表示してそれ以外を非表示にする、エリアBに入ったらエリアB用のVideoPlayerを表示して~繰り返し、っていうふうにUdonの処理を作っていけばいいです。私はUdonGraphとUdonSharpがわからないのでCyanTriggerで処理を作っています。

私はOnPlayerTriggerStayを使っちゃってますが、これはFixedUpdateと同じで頻繁に処理が実行されちゃうのでOnPlayerTriggerEnterのが軽いです多分。

CyanTriggerで作った処理
CyanTriggerについては前回の記事で説明してあります

ここで有効化/無効化しているVideoPlayerはToolsMenu下のVideoPlayerです。VRCHandMenuのUI部分ですね。さっき手順②でやりました。

VideoPlayerを有効化/無効化したら、UIも自動で整理されるので便利です。uGUIとVRCHandMenu凄いですよね。

これでエリアごとに操作できるYamaPlayerを切り替えられるようになりました。ClientSimかTestBuildで動作チェックをして正常に動いたら喜びましょう!

おわりに

いかがでしたか?今回の記事が皆様のワールド作成の参考になったら嬉しいです。VRCHandMenuとYamaPlayer、とっても便利なのでぜひ使ってみてください!

ここまで私の記事を読んでいただきありがとうございました!


この記事が気に入ったらサポートをしてみませんか?