World/Udon Bugs & Feature Requests

Post about current World or Udon bugs feature requests. One item per post!
Non-constructive and off-topic posts will be moved or deleted.
Sub-Instance System for Isolated Small Group Gameplay
Add a system that allows world creators to programmatically spawn separate, isolated instances specific scenes for small groups, then return players to a lobby instance when finished. The Problem: Currently, all players in a VRChat world exist in the same instance, meaning Performance degrades as player count increases Can't isolate small groups for competitive/co-op gameplay without forcing them to manually create new instances outside the world Can't split part of the worlds that are meant for different gameplay purposes (Lobby, In-Game, AFK Lobby) without uploading different worlds, hurting playercount. Proposed Solution: Allow world creators to programmatically create sub-instances - separate VRChat instances that players can be sent to and returned from via Udon. Example Flow: Main Lobby Instance (80 players) - Social hub, party formation, leaderboards Players form a group and trigger "Start Game" New Sub-Instance Created - VRChat spawns a new instance with: Different Unity scene (e.g., the actual game map, not the lobby) Fixed players (For gameplay and balance purposes.) Only loads game-relevant scripts and objects Completely isolated from the lobby instance Players play the game in this clean, performant environment Return to Lobby - When finished, players are sent back to the original lobby instance (or any instance that is a lobby instance) Why Separate Instances Matter: Performance - Players in the game don't have to sync with 80 people in the lobby Isolation - No interference from other players, guaranteed player count Scene Management - Lobby assets/scripts don't load in the game instance, game assets/scripts don't load in the lobby Scalability - Supports many concurrent groups running a complex game without bottlenecking the main lobby Lobby system brings in that important social bigger than oneself feeling. Technical Requirements: World creators would need Udon APIs to: Create a new instance of a specific scene with defined parameters (player cap, access control) Send specific players to that instance Return players to the original lobby instance when the game ends (or any lobby) Optionally: Pass data between instances (score, loadout, etc.) Use Cases: Dungeon Crawlers - Party forms in lobby → enters isolated dungeon instance → returns with loot Lethal Company-style Co-op - 4 players drop into a procedural map for a scavenging run, return to lobby to sell/upgrade Competitive Minigames - Clean, performant 1v1/2v2/4v4 matches without lobby interference Current Workaround (and Why It Sucks): Right now, players have to: Leave the world entirely Manually create a new instance in a separate world via the worlds menu Invite their friends Play the game Leave and rejoin the lobby world This breaks immersion, kills player retention, and makes discovery nearly impossible since it will split playercounts. Also persistence currently doesn't support sharing data in multiple worlds.
6
Allow world creators to query remote players' TrackingData, and actually return their TrackingData (NOT bone data) at a timing that lines up with their bone data
Since we can only get remote players' bone data at the moment, it's essentially impossible to create many different systems reliably (the most significant to me being any sort of reliable custom VRCObjectSync alternative optimized for any given world's specific needs) without some pretty significant compromises. You can either follow bones exactly without any offset, leading to awkward/incorrect visuals, or you can calculate local offsets before syncing data which leads to inconsistencies, or you can add arbitrary predefined offsets which also lead to inconsistencies, all while dealing with inconsistent latency offsets that can sometimes lead to wild discrepancies in position & rotation between the holder and remote users (syncing TrackingData on a manual behavior currently sends the data WAY too early, and there isn't really a way to verify it's still valid anyway since so many bone data points are just discarded to the point where creators can't reliably predict what will happen when a behaviour inevitably receives TrackingData too early). This is especially critical if the rotation of a synced object MUST be perfectly accurate at all times for any given use case; achieving behavior like this while also significantly reducing overall network usage and allowing creators to put manually-synced scripts on pickups (while also syncing their positions/rotations manually), is currently impossible without significant unnecessary sacrifice. This has other implications as well; if a creator needs to reliably put something above a remote user's head, rotated a certain way, they can't. Because "what if the remote user's avatar has their head rotated in an unconventional way?" "What if the rotation of a synced object is critical, but the remote player's avatar is culled, thus preventing Udon from getting accurate bone data?" "What if someone hides a remote player's avatar, thus likely changing all of their bone orientations while they're being tracked?" There are tons of reasons why only providing bone data just isn't sufficient at all for really anything that needs to be 100% reliable like TrackingData would be. Every player-tracking idea I can think of is always thwarted by "but what if a player has an unconventional avatar"? or "but what if a player's avatar is culled/hidden?" As a result, please allow GetTrackingData() to return remote users' actual TrackingData, not just bone data, in the same update/network timing as each player's bone data is sent, so that creators can create systems that reliably line up remote user TrackingData with their visible body movements; systems that will significantly reduce your servers' overall network usage fundamentally across the platform, while tangibly improving player experience. If this functionality needs to be opted-into so as to keep the default behavior performant by not calculating/syncing TrackingData all the time, that's fine; maybe have a synced boolean flag on VRCPlayerApi that reliably enables/disables the calculation/syncing per-user at manual sync timing with "OnTrackingDataSyncToggled()" callbacks. Or if you're already syncing this value alongside bone data, just expose it to us. Or if not, maybe you can calculate certain offsets for each possible avatar a user could present to a remote user at any given time (including while culled and while changing avatars, please make this available and accurate under those conditions as well), and save those offsets locally to be used whenever GetTrackingData() is queried. Even a compressed version of TrackingData that's localized to each player's playspace origin (or some other position that's consistently very close to the player, while also being the same for each player in the instance regardless of avatars or culling settings) that would cut the required networking data down to less than half using shorts/bytes (any Quaternion can be synced using 6 bytes, and the same can be said about any local-space short-distance Vector3) sent as needed, with a "remote user TrackingData may not be perfectly accurate to a tenth of a micrometer" disclaimer to creators, would be sufficient. Whatever the required/optimal solution may be, I'm sure the creator community AND the player community AND the VRChat server rack community, would all greatly appreciate this feature and the creations it would enable.
0
·
Feature Requests
Load More