自分の UI
標準パネルの見た目を変える、コードなしで自分のキャンバスやワールドのオブジェクトに操作を作る、C# で部品を書く。
標準パネルに特別なところはありません。普通の uGUI に小さなコンポーネントが 6 種類載っていて、それぞれが VideoPlayer を指しているだけです。パネルにできることは、自分の UI でも同じやり方でできます。
パネルの見た目を変える
プレイヤーの Controls オブジェクトの下はすべて自由に変えられます。色、スプライト、フォント、レイアウト、どのボタンを置くか。ボタンを消しても残りはそのまま動きます。部品は名前で何かを探したりせず、インスペクターで設定した自分の参照だけを持っています。
コードなしで操作を作る
これらを自分のキャンバス、ワールド空間のメニュー、実物のオブジェクトに付けて、player を設定します。
| 部品 | すること |
|---|---|
VideoButton |
UI の Button から、またはコライダー付きのワールドオブジェクトの Interact からコマンドを実行します。状態をアイコンで示し、ローカルプレイヤーが使えないときは無効になります |
VideoLabel |
項目を TextMeshPro のテキストか旧来の Text に書きます。接頭辞と、空のときの文字を指定できます |
VideoSlider |
全員のためにシークする、または自分の音量を変える Slider |
VideoLinkField |
VRCUrlInputField。Enter でリンクをキューに入れ、enterPlaysNow ならすぐ再生します |
VideoShowWhen |
条件が成り立つ間だけオブジェクトを表示し、読み込み中のくるくるも回せます |
VideoQueueRow |
キューの 1 項目。タイトル、追加した人、今すぐ再生、削除 |
VideoButton はコマンドを取ります。TogglePause、Play、Pause、Skip、Stop、Reload、ToggleLoop、ToggleLock、ToggleMute、ClearQueue のどれかです。icon とスプライトを 2 枚渡すと切り替えてくれるので、ひとつのボタンで再生と一時停止を、南京錠で施錠と解錠を示せます。ワールドのオブジェクトで button を空にしておけば、VRChat で押したときにコマンドが実行されます。
VideoLabel は項目を取ります。Title、AddedBy、Status、Time、Position、Duration、Remaining、Volume、QueueCount、NextTitle、Owner、Url のどれかです。時間の項目は 1 秒に数回更新され、それ以外はプレイヤーが変わったときだけ変わります。
VideoShowWhen は条件を取ります。Idle、Loading、Playing、Paused、Failed、Live、HasVideo、Showing、CanSeek、Locked、CanControl、CanModerate、Muted、Looping、HasQueue、HasProblem のどれかで、invert で逆になります。targets を表示・非表示にするので、アクティブのままのオブジェクトに付けてください。自分の GameObject を隠した部品は更新が止まり、二度と戻りません。
物理ボタンがひとつと上に看板がある映画館の座席なら、コードは要りません。ボタンに TogglePause の VideoButton、看板に Title の VideoLabel を付けるだけです。
C# で部品を書く
VideoPart を継承して Refresh を実装します。プレイヤーの準備ができたときと、UI に表示するものが変わるたびに呼ばれます。
public class NowPlayingSign : VideoPart
{
public TextMeshProUGUI sign;
protected override void Refresh()
{
sign.text = player.IsPlaying ? player.Title : "";
}
}
Tick はその後、毎フレーム呼ばれます。時計のように勝手に動くもの向けです。Position はそこで読み、処理は軽くしてください。
プレイヤーはどこからでも呼べます。PlayUrl、Enqueue、Play、Pause、TogglePause、SeekTo、Skip、Stop などはリファレンスにあります。コマンドはロックを確認してくれます。操作を許されていないプレイヤーの呼び出しは何も変えず、Status に短いお知らせを出すだけです。
自分のコードからプレイヤーを読む
VideoPart から読めば、タイミングを気にする必要はありません。部品はプレイヤーの準備ができるまで待ちます。別のビヘイビアの Start や Update からプレイヤーを読むコードは、先に player.player が設定されているか確かめてください。コマンドは Refresh を含め、どこからでも呼べます。