VRChat 非公式日本語ドキュメント

Udon Video Sync Player

概要

ビデオをみんなで一緒に視聴するために同期が必要な主な要素は、再生するビデオのURLと、全員が同時に視聴できるようにするための再生時間の2つです。途中参加者を含めた全員に対してこれら2つの項目をどのように同期させるのか、このプログラムを使用したシナリオに沿って解説します。

**URLを入力する側のフロー:** UdonSyncPlayerオブジェクトのオーナーになる ▸ 新しい url を送信 ▸ URLのロードと再生を試みる ▸ ビデオ開始時に同期情報を送信 ▸ syncFrequency 秒ごとに新しい同期情報を送信

**それ以外の全員のフロー:** 新しい url 値を受信 ▸ URLのロードと再生を試みる ▸ 同期情報を受信 ▸ 同期された時間にジャンプ

誰かがURLをロードした場合

仮定のシーンがロードされたとき、まだビデオが再生されておらず、部屋に2人のユーザーがいるとします。誰かがInput Fieldに新しいURLを貼り付けると、UIに接続されたOnURLChangedイベントがトリガーされます。 誰かが新しいURLを入力すると、このロジックが実行され、新しいURLが全員に送信されます。 ここには、破棄されたオブジェクトや適切にセットアップされていないオブジェクトに対してメソッドを呼び出さないようにするための'IsValid'呼び出しがいくつか含まれています。説明を簡潔にするため、この例の残りではこれらについての説明は省略します。

ローカルプレイヤーが新しいURLを入力したため、プログラムのオーナー権限をそのプレイヤーに付与し、変数を制御できるようにします。InputFieldからURLを取得し、urlシンボルに対してSetProgramVariableを呼び出し、新しい値を設定します。これは「sendChange」を有効にしてset urlを呼び出すのと同じ動作ですが、別の方法として知っておくと、他のUdonBehaviourの変数を変更したい場合に便利です。この変数を更新したら、RequestSerializationを呼び出して、ワールド内の他の全員に対してurlの値を更新するようUdonに要求します。

ユーザーが新しいURLを入力する

同期されたurl変数が変更されるたびに、それを再生しようとします! グラフ内にurlVariable Changeイベントがあるため、URLが更新されるたびにこのイベントがトリガーされ、そのURLを再生しようとします。

動画が開始される

このイベントは、動画の再生が実際に開始されたときにローカルでトリガーされます。オーナーとそれ以外の全員に対して同じイベントを呼び出しますが、それぞれの異なるロジックは UpdateTimeAndOffset で処理されます。

Update Time and Offset

まず、このロジックはオブジェクトのオーナー上で実行されているかどうかを確認します。オーナーでない場合は、代わりに Resync イベントを実行します。オーナーである場合は、動画の再生位置と、その時点でのサーバー時間を同期させます。これら2つの値を保存しておくことで、今後の同期更新にも利用できます。

私たちは2つの数値を全員と同期させたいと考えています。これら2つは密接に関連しているため、1つのVector2変数にまとめて管理し、同期ロジックの一部を簡素化します。Vector2を構築し、『x』にビデオの現在時刻、『y』にオーナーがその時刻にいた時に観測したServer Timeを代入します。この情報により、他の全員がビデオの現在位置と、その時点でのサーバー時間を同期させることができます。詳細は以下の Resync を参照してください。

この同期変数の RequestSerialization を呼び出した後、オーナーは SendCustomEventDelayedSeconds を呼び出してこの値を再度更新します。オーナーは syncFrequency 変数を使用して、次に値を更新するまでの時間を決定します。非常に シンプルなアプローチをとる場合、オーナーがビデオの停止、巻き戻し、早送りを行わないのであれば、この変数を0に設定し、timeAndOffset を頻繁に更新する代わりに全員がビデオの開始位置から同期するようにすることも可能です。

Resync

オーナーでないプレイヤーが動画の再生を開始したとき、または timeAndOffset 変数の更新を受け取ったときに、そのデータを使用して動画のどの位置にジャンプすべきかを判断できます。

単純な例として、オーナーがサーバー時刻 1000 の時点で動画の 0 秒目にいたとします。

  • オーナーは timeAndOffset を (0, 1000) に設定します。
  • あなたが 45 秒後に参加してこの値を取得した場合、自身のサーバー時刻は 1045 となるため、サーバー時刻の差分 (45 秒) を求め、動画の時刻 (0 秒) に加算することで、動画の 00:45 にジャンプします。

改善と拡張

この例は理解しやすく拡張できるように非常にシンプルに作成しました。これを改良して変更を共有するためにできることはたくさんあります!いくつかアイデアを紹介します:

  • オーナー以外のプレイヤーには、オーナーから情報が届くまで動画の再生を待機させる
  • ストリーミングURLと動画ファイルを判別し、同期を無効にする
  • Video Errorイベントを処理し、ユーザーに役立つメッセージを表示する
  • 特定のプレイヤーのみが動画を変更できるように制限する
  • 動画のプレイリストを作成する
  • 動画のキューイング(予約)システムを作成する

最終更新: