This is an old revision of the document!
Table of Contents
Random VRChat Dev Knowledge
I am going to try to use this page to keep track of arcane knowledge, tips and tricks, bugs, etc related to VRChat project development. It's both for my own reference and for anyone else who stumbles across it. The notes here aren't necessarily about advanced topics, and some are just things I wish I knew sooner. Hopefully it'll help you solve a problem or inspire you to create something.
Braces inside strings cause VRCJson's deserializer to blow up
Despite this being perfectly valid, of course. You can either strip these characters or escape them (\u005b \u005d \u007b \u007d). Ancient bug, unfixed since ~2023. Canny1 Canny2
A more performant way to do toggleable Update() loops
In many cases you may find yourself making Update() loops that exit immediately if some bool isn't set. This of course still incurs the performance hit of entering Update() and checking the bool every frame. Instead, you can have a worker function that you enter once, and inside it use SendCustomEventDelayedFrames to call itself again on the next frame until the work is finished. This can help quite a bit if you'd otherwise be using Update() loops on a lot of objects in the scene.
VRC Quick Launcher is a godsend for world dev
Launching B&T clients (or not launching them!) is cumbersome in the SDK panel in the editor. VRC Quick Launcher lets you do this in a more customizable and repeatable fashion. I had to install Creator Companion to get this tool even though I use ALCOM, since I don't think VRChat distributes it any other way.
TextMeshPro fallback fonts
VRChat has its own TMP fallback font that is used even if you don't configure any fallbacks yourself. It includes at least CJK characters. This can be a blessing or a curse depending on what you're doing.
InputField keyboards differ between PC and Quest
The virtual keyboard used for InputFields has degraded functionality on Quest despite looking very similar to the PC one. Canny. Also be aware that on Android (mobile) it tries to use the system keyboard instead.
String/Image Loading user-agent is different on iOS
The iOS client uses a different (and arguably better) user-agent format from all other platforms. Canny
TextMeshPro markup can be used on Interact tooltips
Although I have only tested the color tag myself.
Fast CRC32
Animator.StringToHash() is faster than writing your own CRC32 in Udon.
