(I’m aware of the fact that Roblox is not currently willing to invest engineering time into new VR features. This feature request stands as an expression of interest, which could be revisited later on if Roblox chooses to reinvest in VR at a later time)
Currently on Roblox, it’s impossible to customise the spectator UI for VR-enabled games.
To clarify, when I refer to the spectator UI, I’m referring to the visual elements that show up on the ‘flat-screen’ display while Roblox is being used in VR mode:
Currently, this consists of only three elements (except for the MicroProfiler):
- a wide view of what the player sees, scaled to fit inside the screen bounds
- the account age indicator
- the VR idle status
The first, and easiest change, is to remove the account age indicator (it shows up nowhere else in the UI and is useless cruft that only takes up screen space) and to align the VR idle status with Roblox’s more modern UIs. I already have textures for this, which took about an hour to make, and it does a lot to freshen up the experience:
The second improvement, which I would consider important for accessibility reasons, is to show a properly cropped view on-screen. The current view has an extreme field of view, which not only makes content on the screen much smaller than it appears in the headset, but also can induce motion sickness from the large amount of distortion this introduces.
On a technical note, I do understand this is just showing the render target from one of the eyes, and introducing a dedicated spectator camera would introduce more overhead. However, you don’t need to re-render everything to do this. Instead, change how the view is displayed on-screen; instead of fitting the square to the screen, allow the square to fill all the available space and be cropped by the sides of the screen. This immediately reduces the vertical field of view, and makes better use of the display’s real estate to show more detail to spectators.
Current behaviour - fitting to screen
Proposed behaviour - filling screen, no extra zoom
Furthermore, a setting can be introduced to allow the view to be zoomed in further to reduce the field of view. This has the dual effect of making details easier to see for spectators, and reducing the effective field of view and hiding distortions that can induce motion sickness for spectators.
Proposed behaviour - filling screen, zoom in 25%
The next improvement I would make is allowing developers to display their own spectator UIs. This is a practice that was pioneered by games such as Half-Life Alyx, and allows the game developer to show relevant information to spectators, rather than having to glean it from diegetic in-game UIs from the player’s unstable point of view.
Custom spectator UI in Half Life Alyx - health, resin, held items and ammunition are shown on screen, so spectators don’t have to glean this information from the diegetic UI on the player’s hands.
The way that I propose this system work is by adding a
VRSpectatorOnly property to ScreenGui, which prevents a ScreenGui rendering on the headset display and instead shows it on the ‘flat-screen’ display (or, equivalently, an enum to configure what display a ScreenGui targets). If one or more spectator UIs are being shown, then the default VR idle status UI will be hidden to make real estate available for developers.
Spectator UI would most likely remain non-interactive (after all, how would the player access these UIs?), but UI elements could be placed here to relay information to spectators. This would be a huge win not only for casual watchers in the room, but also for content creators and streamers who wish to broadcast gameplay to their fans, as this would also help them to follow along. Further integrations via HttpService with stream chats and commands could even be done here, too.
The final (and least urgent) change that I would make would be to render a dedicated view for the spectators to use, rather than using the rendered output from one of the eyes. Because of rendering overhead, this could be an opt-in option accessed through game settings, but by separating the spectator view from the eye view, additional motion smoothing can be applied to counter any jerky movement, reduce motion sickness in spectators, and make for a much more enjoyable and digestible viewing experience. This is an option already provided by a lot of VR games.
I don’t think this would all need to be implemented in one go. The way I’ve set out these changes should hopefully make it clear this can be implemented as multiple iterative passes, each time making a small change to the system to make it more comfortable, modern and useful. I’d again like to stress that I don’t expect this stuff to be implemented anytime soon - as Developer Relations themselves have ruled out historically - but I want to make this post as an expression of interest in this area.