The Customization Update Trailer previewing all of the new available items.
In Red Team Interactive's game, Monsters & Mazes, players compete in PvP matches. At the beginning of every round, one player is chosen to be the monster. All other players must explore the maze, accomplish an objective, and escape within a time limit. The monster and its abilities are unique to every maze. In our backrooms-inspired maze, the monster is the smilier has has the ability to travers walls for a limited time.
Within 3 months of releasing Monsters And Mazes, we had a unique monthly active user count of 33 thousand, over 100 k players, and we're still going up.
Removing the colliders on the walls so that the player who is playing as the monster can move through them is pretty easy. However, we wanted a dissolve effect in our game. As the "shader guy" in our studio, this was my task: how to make a dithering shader that was both performant and interesting on a Quest 2. There were two main optimization considerations: (1) dithering can have major performance impacts when objects are layered on top of one another, forcing the GPU to redraw a pixel and (2) our game included a real-time light - a head lamp on the player's head - which can be intensive on the Quest 2 GPU.
The dithering effect in the backrooms-inspired maze in Monsters And Mazes
When I approached this problem, I figured that I would use Unity's ShaderGraph for an easy and simple implementation. However, this was not at all performant in a dithering shader and when receiving the player's headlamp. This was because ShaderGraph appears to discard (the dither operation) the fragement after all of the lighting calculations & texture reads and ShaderGraph only supports URP's Lit (vs URP's Simple Lit) lighting calculations. This, of course, has a huge impact on our performance. Not only were we forcing the GPU to calculate multiple entire fragments before per pixel but we were also using complex lighting calculations for mobile hardware.
The solution for these two problems was simple: create a custom shader that supported a discard early in the fragment shader and utilize the mobile-friendtly lighting calculations in URP's Simple Lit. To do this, I duplicated the SimpleLit.shader within the URP package, modified it to meet our needs (triplaner projection) and then created a custom early-fragment discard. The shader discards the fragment if the player is too close. A noise texture is sampled according to triplaner UVs to create the dissolving effect and some coloring is applied near the discard threshold. The result is the dithering effect you can see in the gif above.
The final result was much more performant. Before, when the player activated the monster's ability, the FPS would drop to 30 FPS. In addition, the GPU utilization would sky-rocket. After I implemented our own shader, the FPS was a stable 72 FPS and the GPU utilization was impacted marginally. This allowed our player base to enjoy the game to its fullest without any drops in frames!