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を入力したため、プログラムのOwner権限をそのプレイヤーに取得させ、変数を制御できるようにします。InputFieldからURLを取得し、その新しい値を指定して url シンボルに対して SetProgramVariable を呼び出します。これは「sendChange」を有効にして set url を呼び出すのと同じ動作ですが、別のUdonBehaviour上の変数を変更したい場合に便利な、もう一つの方法です。変数の更新が完了したら、RequestSerialization を呼び出し、ワールド内の他の全員に対して url の値を更新するようUdonに要求します。

ユーザーが新しいURLを取得

同期された **_url_** 変数が変更されるたびに、それを再生しようとします!

グラフ内に urlVariable Change イベントを用意しているため、URLが更新されるたびにこのイベントがトリガーされ、単にそのURLの再生を試みます。

動画の開始 (The Video Starts)

このイベントは、動画の再生が実際に開始されたタイミングでローカルにトリガーされます。Owner(所有者)とそれ以外の全員に対して同じイベントを呼び出しており、個別のロジックは UpdateTimeAndOffset 内で処理されます。

更新時刻とオフセット

まず、このロジックではオブジェクトのオーナー上で実行されているかどうかを確認します。オーナーでない場合は、代わりに Resync イベントを実行します。オーナーである場合、動画の「どの位置」にいるかと、その位置にいた「いつ」という時刻の両方を同期させる必要があります。ロジックが最初に実行されるタイミングであれば動画の開始位置にいるはずですが、これら両方の値を保存しておくことで、今後の同期更新にも利用できるようになります。

2つの数値を他のプレイヤー全員と同期させる必要があります。これらの数値は密接に関連しているため、同期ロジックを簡素化し、値をまとめて管理するために1つの Vector2 変数に統合します。x を動画の現在時刻、y をオーナーがその動画時刻にいた時に観測した Server Time とした Vector2 を構成します。この情報があれば、他のプレイヤーは各自の時刻を一致させることができます。詳細は後述の Resync を参照してください。

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

再同期(Resync)

非所有者が動画の再生を開始したとき、または timeAndOffset 変数の更新を受け取ったときは、そのデータを使用して動画のどの位置へジャンプすべきかを算出できます。

簡単な例として、所有者がサーバー時間 1000 の時点で動画の 0 秒地点にいたとします。

改善と拡張

このサンプルは、理解しやすく拡張性を保つために非常にシンプルに作成されています。ここからさらに改善を加えたり、変更を共有したりする方法はたくさんあります。いくつかアイデアを挙げます:

最終更新: