From early 2024 to late 2025, ForwardXP worked closely with Another Axiom (AA) adding features for the legendary VR game, Gorilla Tag!
Overall, while some of the legacy code was a pain to work with, GT has been one of my favorite projects I've ever helped with. It's incredible to see kids enjoy the game, and I never get tired of watching their eyes light up when I tell them that I've worked on Gorilla Tag. It's a magical feeling to hear that people enjoy your work.
I initially prototyped a couple of new gamemodes, including a very large map (4km across!) and a giant dirt pile that you could dig blocks out of Minecraft-style. While I'm very proud of both of them and they were each received very well internally, neither ended up being made into an official gamemode, and while I would love to showcase them here, I'm pretty sure AA wouldn't like me talking about them!
What I will showcase is the tool I'm most proud of: I call it "Continuous Properties". It exists to allow designers to continuously vary a huge variety of things in an intuitive way, based on many different kinds of inputs.
Some examples will follow in the next section, but for most of these you get to define a gradient or a curve that will be interpolated along based on the input from some other script.
That input can be anything, like a speed value, a time value, or a charge value. I made a second small wrapper script called "Continuous Property Array" which made it trivially easy to support Continuous Properties in any new script!
AA made extensive use of Odin Inspector for their cosmetic scripts, and I quickly learned how powerful it can be. With every script we made, we had to assume that a designer may be working on it sometime in the future, so we tried to make the interfaces as intuitive as possible by adding tooltips, foldout groups, and even hiding large swathes of variables when they weren't used.
It really helped me get into a better tool-design mindset, and I think I'll carry that with me to all future projects. It makes iteration so much easier, and you get to be kind to your future self.
The bulk of my work was on cosmetics. Since cosmetics are the primary way the game makes money, the designers want to make them as exciting as they can be, and sometimes that requires an engineer like myself to help script.
Simultaneously, we were working on rewriting almost every existing script to be much more modular, with the eventual aim of allowing the artists and designers to create new elaborate cosmetics all on their own. It was the impetus behind creating the Continuous Properties module mentioned above. It was hard, and sort of strange to think about programming away my own job, but I think it really paid off in the end!
Here are a number of cosmetics I've worked on. I borrowed some frames from the videos of a YouTuber named StyledSnail, since he presents them in a nice way.
Palm Energy Blast
Hold your hands together to gather your chi, then launch an explosive ball forward that blasts away other players!
This one took a lot of tweaking to get right. Attempting to coerce our new modular components together to create this highly specific interaction was actually pretty tricky. I needed to make a new script to detect how closely aligned two transforms were, which basically checked 1) how close they are, 2) how aligned their forward directions are, and 3) how parallel their forward directions are.
Detecting when and where to release the blast was also a bit challenging. For the former, I had to make a motion detector with a debounce time that would fire when it detected that you stopped a particular gesture. For the latter, originally I just had it continue in its direction of motion, but the lead designer had a great tip for me: when people aim something like this, they usually want it to travel directly away from their shoulders. And lo and behold, he was right! It felt great.
It made heavy use of the Continuous Properties, and was a great demonstration of its capabilities. I could easily adjust size/color to provide better feedback while charging the shot, and could also set the corresponding values on the spawned projectile.
Creepy Talking Doll
Grab the doll off of your arm and throw it onto the ground. Then press a button on your hand, gain control of the doll's head, and your voice comes out of the doll itself!
I worked closely with AA's lead designer to get the head control to feel right. Originally I was doing some way-too-elaborate quaternion math, before finally settling on simpler vector offsets.
The walkie-talkie functionality was already implemented elsewhere, but like with many of the mechanics I worked on, I took some time to refactor it into much more modular code.
Evolving Fungal Mutation
A mold that gradually grows across your body over the course of a few minutes, ending with a dramatic mushroom bloom!
Originally the process was going to take a long longer (5-30 minutes) but due to the limited play duration of the average player, and the extra hassle of preserving progress between sessions, we decided it wasn't worth it!
I essentially wrote my own simple animation timeline that integrated with GT's existing systems. There could be any number of "stages" within the animation, and you could fire events at any point (used for enabling the mushrooms on your hands), or run Continuous Properties while the animation was running (used for advancing the blend shape).
Mark One Mitts
Blast out a jet of fire with every movement!
This is probably the cosmetic I'm most proud of. It's conceptually simple, but detecting hand taps was actually pretty tricky. I had to dive deep into the original movement code for the game and do a lot of refactoring in order to add in the necessary hooks. It was nerve-wracking because I knew if I changed the existing logic, I would be upsetting hundreds of thousands of players!
The new hand tap event can be accessed via an interface, and new scripts can read a variety of information about the hand tap, or even modify its data before the user sees it. I used this to change the audio clip and volume based on the speed of the player.
After that, it was just a matter of tuning the particle systems to feel just right, both when you're stationary and when you're moving at high speed. It plays a satisfying sound, and the controllers vibrate like a spring, which gives it a very bouncy feel.
As a last-minute addition, I added a feature where pointing the gloves towards each other causes fire to blast out from both gloves and rapidly fan outwards.
The new hand tap detection script I wrote, which lets you either fire simple Unity events, or call functions on provided interfaces (as was used here).
Marshmallow Shooter
A handheld gun that shoots sticky marshmallows around. They'll splat on surfaces, unless you catch one in your mouth and eat it first!
Originally you were supposed to "blow" into the open tube (it would detect a sudden microphone input as a firing trigger) but we eventually deemed that too obtuse. Instead you just click the trigger to fire.  Nice and simple!
The projectile shooting code was already written, so my main bit of new code was the sticky projectile. It needed to be able to account for hitting colliders AND triggers, since the players' colliders are triggers.
It also has a special editor interface for detecting hits on specific areas of a player's head, which is used for eating the marshmallow in this case, and was later used for the Spitting Dino Umbrella which shoots acid into peoples' eyes.
Poly Gloves
Flash your mitts with the energy of cyberspace with every touch!
This one uses both the new hand tap detection script AND the Continuous Properties working together!
Back Tendrils
Wave your evil tentacle arms as you haunt the world!
Another one that uses Continuous Properties, to a larger degree this time. It uses the speed of the player to adjust the speed of the resulting animation and the volume of audio sources, and also toggles some trail renderers on and off when they pass a certain threshold.
Popcorn Pan
Cook some delicious popcorn above a fire until it blows its lid!
This one connects GT's temperature management system to the timeline script I wrote for the Fungal Mutation fur. The higher the temperature, the further down the timeline the animation goes
Similarly to the fur, the timeline progress drives a blend shape value using the Continuous Properties module.
Butterfly Net
Equip the net and catch the butterflies that start spawning around you!
This was actually the very first cosmetic I made, though it released much later than intended due to factors outside my control.
Despite its apparent simplicity, It required an entirely new subystem to be added to the game. I wrote a manager that spawns small "critters" that behave deterministically based on their spawn time, so all players see them the same way without requiring any additional networking.
Even so, this was my first time ever touching true netcode, and it was quite a learning experience. It's a different mindset to think of different players as having entirely different game instances that are basically just pretending to be in sync with each other. And trying to harden your code against every possible attack vector by someone who may be intentionally trying to ruin other peoples' gameplay experience was quite challenging for a first-timer.
Giant Spinning Back Key
Become a giant windup toy!
This was another one of the first cosmetics I helped make. It's basically just a transform that spins more the faster you move. I added some bells and whistles, such as the ability to play an audio clip every n° of rotation, and a helpful editor interface that draws debug lines to show the relative direction and rates of rotation.
Fire Fur
Set the world on fire as you walk!
This was a relatively simple one. It once again uses my script to detect hand taps, connecting it to GT's bespoke fire management system (which is actually quite elaborate) to spawn a flame instance.

You may also like

Back to Top