Welcome to the Developer Update for 2 May 2024!
Today’s Dev Update thumbnail features ケセドの花見舟-CHESED’s JAPAN SAKURA SHIP- by ケセドCHESED! Enjoy watching cherry blossoms from this cross-platform houseboat! It is Golden Week after all…
If you’d like to catch up, you can read our previous Developer Update from 11 April.
Important Info / Announcements
Golden Week Feature on VRChat
Golden Week in Japan is here! Enjoy our Japanese-themed world row for Golden Week until May 13th!
Ongoing Development
The Input Update
We have an exciting new update coming soon that will revolutionize how you interact in VR, both with and without controllers.
Cross-Platform Hand Tracking
We’ve reworked our hand tracking system that was originally built for Meta Quest to be able to work on any platform capable of providing skeletal hand tracking data. This allows for both for using the tracking data to animate your avatar’s hands and the ability to use hand tracking as input for navigating interfaces, moving around the world, jumping, and more.
The gesture-based input system has been given a lot of polish, with a new visual feedback state system. This should make inputs more reliable, and harder to accidentally activate. This will also make it more likely to activate when you want it to.
We’ve also improved the expressiveness of the menu lasers, making the menus easier to navigate.
The first platform to utilize this new cross-platform hand tracking system is SteamVR. The skeletal data is applied any time skeletal data is available, regardless of whether the fidelity level is estimated, partial or full.
The SteamVR controller drivers animate their skeletons when in estimated and partial mode to include extra ‘life’ to the hands, such as slightly closing the hand when you put your hands down by your side. The application of skeletal tracking data even with controllers also means that on Index controllers, your thumbs up will look correct!
This leads us into the next part of the Input Update:
SteamVR Input 2.0 Controllers
We will be taking full advantage of SteamVR Input 2.0 to bring a large variety of new features and customization and improve compatibility with existing and future VR controllers.
- Full controller remapping - remap any action to any button you want on any controller, the customization possibilities are nearly endless!
- SteamVR Skeletal System - brings improved finger tracking to Valve Index controllers. Also allows for finger poses to still happen while gestures are disabled on Meta Touch, Pico, Vive XR Elite, and other similar controllers
- New gesture methods - including the new mappable “Gesture Direct” buttons that let you explicitly map gestures to any button
- Bonus Mappable Actions - A whole array of new mappable shortcuts will made available for use on any button (or as a hold/double-press/chord)
- Gesture Toggle
- Nameplates
- HUD
- Chatbox
- Earmuffs
- Personal Mirror
- Camera
- Auto-Hold - tired of holding the grip button for equipable items like pens and grappling hooks? The option to auto-hold them is now available via the mappable “Drop” action. Now you can press once to pick those equips up and press again to drop them. This feature will also be making its way to all VR platforms.
Localization coming to Open Beta
Full UI localization is getting ready for open beta! This is a huge project we’ve been working for a long time and we’re super excited to see more people being able to see VRChat in their native language! The localization community has been doing a lot of great work to make this a reality and we can’t wait for you to enjoy it as well!
Currently the only UI elements localized are tooltips and the login screen. With this new update, we’ll bring localization to all UI elements in our client. This update will roll out to all of our current supported languages with more languages planned next: Chinese Simplified, Chinese Traditional, French, German, Hebrew, Indonesian, Italian, Japanese, Korean, Polish, Portuguese Brazilian, Russian, Spanish and toki pona
.
As a reminder, localization in VRC is driven by its community, so if you see something missing a translation, you think something could be improved for your language, or if you want to vote for your language to be added next… help us making it happen! Come join our localization community here.
For mobile platforms, you can expect the game itself to be ready for localization, but we’re still working on localizing the native UI, which is the UI present on mobile before launching the game.
Have a sneak peek at the localization of the VRChat UI in Japanese:
Help articles will be localized as well!
SDK May 2024 Roadmap
We created an overview of our plans for the VRChat SDK!
It’s less detailed but quicker to read than our dev updates. Would you like to see more roadmaps like this in the future? Let us know!
Content-Refresh Websocket Event Fixed
We just fixed the content-refresh
websocket event in client for avatars and worlds! It will be in the next release.
This means your authored worlds/avatars lists update in client when you upload/delete a world/avatar.
iOS Conversion for Avatars
You may notice that we’ve been testing automatically converting avatars built for android into avatars for iOS!
It’s experimental at the moment, but allows for a greater amount of content available on iOS without needing existing avatars to be reuploaded by the original authors.
Stay tuned for more news about iOS very soon…
VRChat Constraints
Constraints will finally be available on all platforms! We’re working on a new component for the VRChat Avatars SDK.
VRChat Constraints work like Unity’s constraint components but are more optimized for VRChat avatars. If you use Unity’s constraints, they’re automatically converted to VRChat constraints in-game.
But that’s not all! We snuck in advanced features such as the “Solve in local space” toggle. If you want to add some fake arms to your avatar, try this feature.
The VRChat Constraint component is still under development. We hope you look forward to trying it out later this year!
Web Team Updates!
The web team have been hard at work once again, we’ve made the following assortment of changes and improvements to VRChat - Home since our last update:
- Added tools for uploading custom animated emoji sprite sheets
- Onto your 1024px square canvas you can have:
- 2-4 512px frames in a 2x2 grid
- 5-16 256px frames in a 4x4 grid
- 17-64 128px frames in an 8x8 grid
- Frame rates can be between 1 and 64 frames per second.
- You can set your emoji like
CoolEmoji_14frames_10fps.png
to pre-set the editor to your desired frame count and frame rate. - 1-bit or 8-bit alpha transparency is supported.
- Note that while there is colour bleed between frames visible on the web, it will not be visible in the VRChat client itself.
- Animated gifs are not yet supported.
- We suggest using imagemagick’s montage tool or ffmpeg’s tile filter to convert existing animations into a spritesheet.
- e.g.
montage CoolGif.gif -coalesce -geometry 256x256 -tile 4x4 -background none CoolEmoji_14frames_10fps.png
- e.g.
- Have fun reaching your Emoji Limit again!
- Onto your 1024px square canvas you can have:
- Significantly reduced the amount of code you need to download to view any given page on the website!
- We’re seeing up to a 50% reduction in data and a 30-50% reduction in load times in our testing in various scenarios, and there’s headroom for more
- If you’re on a slow or high-latency internet connection this should make joining an instance you were linked to, or just exploring the website, quicker and more reliable!
- The “launch” page for an instance should more consistently provide the correct locked/unlocked link types for Group instances
- Fixed an issue breaking the password reset form when an error is encountered from the API
- Fixed an issue causing “Explore Worlds” pages to only show worlds uploaded with an old SDK version
- Fixed an issue causing the VRChat Credits symbol to appear as a □ square for some people
- Fixed an issue which briefly prevented the Marketplace page from loading.
- Various things we can’t tell you about yet
Changes to Instance APIs and Auto Creation
Hey folks who poke our APIs! This is largely a very technical topic that will not affect most people and will largely go under the radar, but for third parties who may be touching our APIs we want to give a bit of warning around some changes which are coming soon.
VRChat instanceIDs have always worked so that if you craft a valid instanceID (think: 42705~hidden(usr_***)~region(use)
), and then attempt to access an instance with that ID, we would create the instance if it didn’t already exist. We call this functionality Instance Auto Create, and it served us well when instances were much simpler and most of the data about an instance was actually embedded in the ID itself.
As we’ve slowly been rewriting how instances work, both to make them more secure, and add extra functionality, we’ve been moving away from adding anything more to the instanceID. In fact, in time we want to entirely replace the custom instanceID format we use with a generic UUID like we do everywhere else in our systems. This would unlock a lot of cool stuff, and maybe even open instances to be able to be dynamic in a lot of very cool and interesting ways!
To get us closer to that potential future and all the amazing possibilities it might offer us, we first have to kill Instance Auto Create.
For standard users this won’t mean anything, nothing changes for you. Instances will still be created, short links to instances will still work, etc. This only affects people who create instances by crafting valid instanceIDs outside of VRChat systems.
Thankfully, for those people there is a very simple fix: stop crafting instanceIDs, and call the instance create API directly, and we’ll give you back a valid ID. You can do this right now and this method of instance creation has been around since Groups launched.
Instance Create API
So, in a very rare (but hopefully less rare) case of us documenting something about our APIs, here is how the create instance API looks and functions.
The API endpoint for instance creation is: /api/1/instances
, with POST as the HTTP method.
The expected data is JSON as follows:
"type": "<one of: public|group|hidden|friends|private>",
"worldId": "<worldId>",
"region": "<one of: us|use|eu|jp>",
"ownerId": "<userID or groupId>",
"groupAccessType": "<one of: members|plus|public>",
"roleIds": []<groupRoleIDs>,
"canRequestInvite": <boolean>,
"queueEnabled": <boolean>,
"closedAt": "<dateTimeString>",
"hardClose": <boolean>,
}
So what do some of these fields mean!?
type
: always required and is fairly self explanatory, the type of the instance. Although note that hidden
is actually what we call friends+
, and invite+
doesn’t actually exist unless you set canRequestInvite
(this is weird we know).
worldId
: is always required, just an ID of the world you want the instance to be of.
region
: always required, what region you want your instance in.
ownerID
: required for all types except public. GroupId if group instance, or userId if user instance (hidden|friends|private).
groupAccessType
: defaults to members
, controls what the access type for the group instance is.
roleIds
: only applies to group
instances with access type members
, an array of roleIds to limit the instance to.
canRequestInvite
: only applies to invite
type instances to make them invite+
(yes, it’s odd, we know).
queueEnabled
: enables queues for group
instances.
closedAt
: A date time in the future to close the instance at. This is already supported, and works, but we haven’t yet finalized our UI for exposing this. Doesn’t work for public
instances. Scheduled instance closing UI? Maybe coming soon! (no promises though)
hardClose
: Currently unused, but will eventually be a flag to set if the closing of the instance should kick people.
Instances created using this API will exist and be accessible. Other than our own official UIs for creating instances, this API endpoint will soon be the only way of creating instances. So if you’re creating instances directly via our APIs, this is how you will have to do it going forward, if you don’t already!
New Home World Update
We’re ready for you to check it out!
Here’s the World Link, hop in and enjoy the vibes!
This is a separate ID; we’re running a brief Open Beta test before moving it to the Default Home ID.
At this stage, we’re polishing up some final details, so we’d love your feedback on any bugs or usability issues, but we’re not ready to field new feature requests just yet. We’re focused on stabilizing the new world as a solid foundation as we move forward.
Here’s the Canny link if you find glitches or gremlins! We’ll be tackling high-priority bugs before releasing the world.
There’s already an internal list of improvements and fun stuff we’re looking forward to adding… and we’ll be doing Home makeovers for seasonal stuff like Spookality, limited-time Events, and collaborations with third-party Partners!
Finally, we added a music player!
The new default track is Youth by Toby Schay; we felt the mood matched the chill feeling of the Home world perfectly.
You can find more tunes from him here: (the whole Overgrowth album is great)
Instagram: @tobyschay
There’s also some hits from the VRChat archive… remember the Obstacle Course Jam?!
Here’s the other tracks in the player, check 'em out!
Seeking Solace by Arcane
Partially Offline by Andrea Baroni
Speed Trials by Rocktopus
Conclusion
That’s it for this Dev Update! Lots to unpack, and we hope you enjoy poking around the new upcoming Home World!
Our next text update is scheduled for May 16. See you then!