你自己的界面
改造默认面板的外观,不写代码在你的画布或世界物体上搭建控制,或用 C# 编写部件。
默认面板并没有什么特别之处。它就是普通的 uGUI,上面挂着六种小组件,每个都指向 VideoPlayer。面板能做的事,你自己的界面用同样的方式也能做。
改造面板
播放器的 Controls 物体下面的一切都可以随意修改:颜色、精灵图、字体、布局,以及要放哪些按钮。删掉一个按钮,其余的照常工作。部件不会按名字去找任何东西,每个部件只持有在检查器里设置好的引用。
不写代码搭建控制
把这些部件放到你自己的画布、世界空间菜单或实体物体上,然后设置 player:
| 部件 | 作用 |
|---|---|
VideoButton |
从 UI Button,或从带碰撞体的世界物体的 Interact 运行一条命令。用图标显示状态,本地玩家无权使用时会自动禁用 |
VideoLabel |
把一个字段写进 TextMeshPro 文本或旧版 Text,可设前缀和为空时显示的文字 |
VideoSlider |
一个为所有人跳转、或设置自己音量的 Slider |
VideoLinkField |
一个 VRCUrlInputField:按 Enter 把链接加入队列,开启 enterPlaysNow 则立即播放 |
VideoShowWhen |
在条件成立时显示物体,还能让加载指示器转起来 |
VideoQueueRow |
队列中的一项:标题、添加者、立即播放和移除 |
VideoButton 接受一条命令:TogglePause、Play、Pause、Skip、Stop、Reload、ToggleLoop、ToggleLock、ToggleMute 或 ClearQueue。给它一个 icon 和两张精灵图,它会自动切换,于是一个按钮就能显示播放或暂停,一把锁就能显示锁定或打开。在世界物体上把 button 留空,在 VRChat 里按下它就会运行命令。
VideoLabel 接受一个字段:Title、AddedBy、Status、Time、Position、Duration、Remaining、Volume、QueueCount、NextTitle、Owner 或 Url。时间类字段每秒更新几次,其余只在播放器变化时更新。
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。播放器准备好时会调用一次,之后界面要显示的东西每次变化时都会再调用:
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。