Trickshots: A VR Sports game

DEVELOPMENT PROCESS DEEP-DIVE

This page covers my approach to:

  • Early project planning.

  • Prototyping. Lots and lots of prototyping.

  • Pivoting from Multiplayer to Single player.

  • Finding the fun.

  • Finishing and publishing the game.

PRoject Goals - why make a vr sports game?

  • I wanted to make an extremely accessible VR sports game.

    • This was probably the biggest objective for the entire project. I have designed a lot of sports games, and to me the biggest barrier of entry is accessibility. A lot of sports games rely on the user’s preconceived notions of how that particular sport works and how the sport is played. For some sports games, that can be extremely overwhelming. I played football in college and yet trying to pick out the best defensive package to run on a 3rd and 5 from my opponents 32 yard line with 3:43 left in the 3rd quarter just was too much.

    • Instead of trying to recreate a live sporting event, I wanted to recreate how a kid feels when playing in their backyard. Instead of having a massive crowd of people, jumbotrons, sports tickers, play UI or commentary - why not let the user just enjoy the sport itself?

    • I wanted to make everything is diegetic as possible. VR is extremely immersive, but seeing menus in VR really takes you out of the experience. So I didn’t want a single menu in the entire game. If the user needs to use UI, it needed to be grounded in the world somehow. Sports games are 50% menus, and that’s okay! I just wanted to try and diverge this game away from that and really focus on the fun.

  • Fun over everything else

    • I wanted the player to have fun instantly, and by instantly, within the first minute. This wasn’t going to be easy, but it was the most fun part of the process.

    • 0 attributes. Having this as a design constraint really helped solidify how equipment and balls would work. If one bat hit further than another, then why would a user even pick up the first bat? Then would you have to design wasted content around a bat that you briefly use? If all bats hit the same, the the user can use whatever bat they like with every course - and that seemed way better to me (on paper)

  • Simple to learn, tough to master

    • As a massive fan of Rocket League, I had always wanted to make a game that anyone can pick up and play, but it takes a long time to master. This meant simple controls that had dynamic results. In Rocket League, (not to simplify it too much), you are a box that hits a ball - but that ball can go anywhere, based on how you are hitting it. So I wanted to do the same thing, but with a bat and a ball.

    • If something couldn’t be performed over and over again with the same results, it was booted. If you couldn’t reliably predict where a ball was going to go, then whatever mechanic that was driving that go the back seat.

Where to start?

The initial idea for the project, and well into it’s development, was to create a “Sandlot Sports Environment” where kids could go play multiplayer games together. But you have to start somewhere right? Here was my plan of attack:

  • Get a basic baseball mechanic working

  • Get 2 users in the game together

  • Get 2 users in a game together hitting the same ball

  • Build out other sports mechanics

  • ???

  • Profit!

Needless to say, the initial plan of attack diverged a lot from it’s original plan - but man I learned a lot. As the project went along, there were a lot of new challenges and new ways to think about planning - which I took in full stride.

Below is the first video of the first prototype I made - A box shooting a ball, that could be hit with a bat.

Time to protoype mechanics

Backyard and other sports Prototype

  • After the initial basic prototype was done, I wanted to build out a little backyard environment so I could start to see what the world would be like.

  • I also needed to make a fence “homerun zone” that the user could hit a ball over for a homerun to count.

  • After a basic backyard was made, I started to see what other sports I could put in the backyard that used the same “grabbing and throwing” mechanics that were including with the basic XR package.

  • This led to “basketball” and “cornhole” and trying other sports.

  • Once I had some of these basics in, I decided to start exploring other game mechanics, like golf and hockey.

  • Both were not the easiest to work with, since the collider of the stick would prevent the club some swinging smoothly BUT it did teach me how to create a ball spawner.

the first sandlot prototype

  • The original idea of the game was to make a “sandlot” multiplayer environment that kids could play in. Each user would be able to have their own backyard to put games and decorations in, while being able to visit their friend’s backyard in their neighborhood. The sandlot would be massive, while the backyards would be smaller - users could build games together in the sandlot, while building their own games in t heir own backyard.

  • I started off by making an extremely large sandlot, and then populated the space around them with 16 houses. I wanted to see what it felt like in VR, and it actually felt great! Not too big that you didn’t want to cross the sandlot to go to your friends house, but not too small that the area felt cramped.

  • I added a lot of trees to really mask the emptiness behind the houses, and also added some textures to the ground to create and baseball field in the corner. This really was a huge step and it started to feel like an actual sandlot environment.

Pitching Machine with different balls & Neighbor Houses Prototype

  • This was one of the “ah ha” moments.

  • I decided to put a soccer ball and basketball in the pitching machine, instead of the baseball.

  • I also tweaked its physics properties to make it go extremely far, and boy was this fun.

  • There was something extremely cool and exciting about seeing a ball go so far, so I put in some neighborhood houses to really recreate being a backyard.

Different sports prototypes

  • After the sandlot has a nice feel, I wanted to see what mini-games felt good both in the sandlot area and in a backyard.

  • I added a bunch of crates stacked on top of each other to see if it felt good to knock them down, and it did!

  • I then tried to make hockey, and it just did not feel right. I would have needed to make the collider physics layer not interact with the ground and then animate the stick to move above the ground layer - and for now that was not in the cards.

  • Tennis was next - and that was great. I added a pitching machine to pitch tennis ball so I could hit them over the net and it worked out pretty well!

Sportsballs!

  • I had a crazy idea that I wanted to test - what if you could throw a ball and an object would appear where it landed. Kinda like a combo between a poke-ball and capsule from Dragon Ball. So I started testing it out, and it was really neat! I thought it would be really cool if kids could collect sportsballs, store them in their backpack and then take them out to show their friends while finally activating them by throwing them on the ground.

  • Essentially you could have 1 item or as many as you wanted contained with 1 sportsball. I thought it would be cool if the user could could customize what was in their sportsball and even get “rare” sportsballs from a giant sportsball gacha machine.

  • I also added in the ability for the user to “collect” equipment by throwing an empty sportsball at an object. This would be the way for the user to store things quickly, without going into a menu.

  • All in all, the sportsballs idea was so strong that I started to pivot the future of the game around them. It was, to me, the most accessible and diegetic way for a user to create and customize their backyard.

backpack and ball selector

  • Another perk of getting HVR was that it came with a backpack! You could grab any item in the game, grab your backpack and drop it in. Then you could pull it out in the same fashion. I ultimately didn’t end up using this, but it was a great prototype.

  • The ball selector was a HUGE part of prototyping. I wanted the user to be able to switch between different balls with different physics properties to plau different games.

  • Once I had both of those working pretty well I wanted to make enough bats to fit in the backpack to see what it was like to pull out each one and play around with different balls in the pitching machine.

  • This was quite the learning time, as I started to add different physics materials to the balls and bats

  • I also added the ability to switch between the pitching machine and a basketball goal, so you could switch between sports really easily.

Voice recognition prototyping

  • After working at multiple sports video game companies, I had always wanted to utilize the microphone more when it came to getting and giving feedback in the game.

  • At Status Pro, I helped design a prototype where the user could say “hike” in the Meta Headset and the ball would be hiked. I had much bigger plans for what we could do with that, so I wanted to see if I could put those ideas into this game.

  • I started off by checking out which voice detection toolset would be best for the game. I wanted the users to be able to give a command, the game understands that command, and then something happens. For example, the user could say “I want to play home run derby, with a green bat and tall fences.” To do this, I would need more than voice recognition - I would need AI to help parse the command and much more.

  • I got wit.ai working within the game, but after many many many hours of debugging - I couldn’t get the game to load without a 2 minute startup. So I ditched the AI part and just started to use the dictation part of wit.ai while also using the Meta Voice SDK.

  • The main goal was to make to make the more accessible by allowing the user to use voice commands instead of going to a menu.

    Animals

  • I love animals so I wanted to make some voice commands that the user could say that would trigger animations in an animation tree.

  • Both the dog and the cat had their own voice command lines and I created a lot of audio snippits for things that they were doing.

    Equipment

  • Leaning into the accessibility design, I created a way for the user to spawn all of the equipment they had stored in their backyard - bats, balls, pitching machines, etc

  • This was all just making the objects enable and disable, but in the future I could really streamline the process.

  • I also hooked up the pitching machine to voice commands so the user could say “pitch me a _____” and the pitching machine would pitch that type of ball. This was an extremely accessible way to be able to play the game.

    Skyboxes with audio

  • I wanted to see what it would be like to play the game at different parts of the day, so I created a Skybox Changer that would change the skybox/lighting/audio based on what command you gave it.

  • I also made it so that the videos played by the video board, when home runs were hit, were changed with every environment the user went to

  • This turned out to be an extremely cool way to set a different mood for the user. If you wanted to just chill out and hit homeruns without the video board going off - go to the “night” mode, or if you wanted to see what it’s like to hit homers in space - go to the “space” mode.

mini-game protoypes

  • Now it was time to make some mini-game prototypes and find some fun. I had a pretty good mini-game template made after I created the first game “3 Point Shootout” and then used that template for the others. It was a great way to re-use elements of the game that each game shared like UI, scoring, sound, start/end elements and other things.

  • I wanted to make a game with each of the pieces of equipment that felt good at the time: baseball, tennis/pickleball/basketball/bow & arrow. I also wanted to see what it would be like to throw a zombie in the game.

  • This was an incredible learning process, as I was understanding how to make modular games and game logic with each mini-game prototype I made. At this time, I was still searching for the fun.

    Pickle-ball Panic

    The idea was super simple. Grab a racket and hit the ball back onto the opponents side. The catch was that the balls were coming from a 6 different machines and kept getting faster as the game went on. This game was a ton of fun and I plan to add it back into Trickshots here in the near future

    Arrow Poker

    Okay, this was by far the coolest mini-game I made and I might have to make it a completely separate game. There was an NHL All-Star competition in Los Vegas where the NHL stars would try and hit giant playing cards in the air to create blackjack hands. I really wanted to make a game like that, so I create a bow and arrow version of it. The user has 60 seconds to make as many poker hands as they can by shooting cards that are circling around them. It sounds easy, but due to the randomization of the cards and how they are bouncing up and down - it became super challenging. To make it a little easier, I added in a way to “shuffle” the cards which would not only randomize the cards but it would also spawn back all of the cards that you had already hit - but the user could only do this 3 times per game. I put the UI on 2 “crunchy” ps1 style monitors and then everything was put on a poker table.

    3 Point Shoot Out

    This was the first mini-game I made, just because I thought it would make the most sense in a multiplayer environment. Unfortunately the shooting mechanic itself was terrible. Out of the box HVR did not work well with shooting basketballs but I did wind up using the game template for the rest of the games.

    Crate Knock Down

    I went back to the crate tower prototype that I had previously made and hooked up “knock down” logic which detected when the crate had been turned past a certain angle which resulted in that crate being “knocked down”. This was was a lot of fun and there is a lot more I want to do to it in the future, which levels, crate weights, different size crates and more.

    Home Run Derby

    The classic. The holy grail of backyard mini-games. My brother and I were constantly playing homerun derby in our backyard growing up, so adding it into the game was a no-brainer. The gameloop was simple - you have 60 seconds to hit a certain amount of homeruns and each round that the amount you have to hit goes up!

sound effects, video board and ball trail prototypes

  • After I had enough mini-games made, I decided it was time to return back to the original back yard to start make a vertical slice of what a “shipped” backyard could look like.

  • The first thing I did was really improve the hitting of the balls from the bats. This required creating new physics materials for each of the bats and each of the balls, but it made the hitting much better.

  • I had yet to add any audio to the game (other than countdown audio) so I made a script to add to the bat that detected which ball it was hitting and made the audio for that particular ball. It also picked from a list of audio samples and then would randomize each sample while not playing the same sound twice.

  • I also added audio for when each ball hit the ground and made a script that lowered the volume by 20% each time the ball hit the ground - simulating a ball bounce fading.

  • To make the backyard feel like it was a baseball stadium, I added in a video board that played a homerun video every time the user hit a homerun. This got repetitive really quickly so I made a script that randomized each video played while also never playing the same video back to back.

  • Through playtesting, I found out that the ball was hard to see once it got past a certain distance - which led me to adding unique ball trails to each of the balls. This solved a problem while also making the balls look really cool.

  • I finally bought a model of a real pitching machine to replace old version I had been using. I animated the wheels, added a wheel-spin sound and a pitch sound. All sounded great and really added to the immersion.

  • I thought it would be neat if there was a dog in the backyard that would react to the user doing well, so I bought a dog-pack and added a puppy to the scene that barked every time the user hit a home run.

HVR implimentation

  • At some point I wanted to switch away from using the default XR controller and switch to hands. But I am not an animator nor am I a modeler, so I decided to buy a license for Hurricane VR (HVR)

  • This was, by far, the best decision I made in the entire project. After I installed the package, I went to work reading all of the documentation on how to set it up in the project and after a couple of hours I had hands!

  • Hands really made such a difference in making the game feel more immersive. Picking up a baseball bat with the XR controller was fine, but picking up the baseball bat with your hands and seeing your fingers wrapped around the bat was incredible.

  • HVR came with a lot of features that I would keep throughout the whole project, but the hand and finger posing was incredible. I could manually hand and finger pose around an object, and I could also put a collider in the object to use the auto posing.

  • There was a lot of learning when it came to the hand posing, in terms of how to access poses and save them off correctly, but I created a lot of hand poses for different prototypes

  • Once I had messed around enough, I started to make poses for objects that I had in the game, like the baseball bat and basketball. Shooting the basketball using HVR was nice, but wow was it not accurate at all.

  • Then I experimented with using two hands to hold the bat. HVR has a neat feature were you can set 2 grabbable spots on the bat and it will put your hand pose anywhere in between those 2 poses. But unfortunately, hitting a VR bat with 2 hands was terrible. I am glad I did the experiment, because I had always wondered if 1 or 2 hands would be better. 1 hand isn’t the “proper” way to hold a bat, while 2 hands looks “cooler”. So accessibility wins again.

  • I also decided to add some “wacky” bats in for the first time, to see what it would be like to have a bread bat or a wiener dog bat. It was fantastic.

The prototype that eventually became the game but i didn’t know it at the time

  • So late one night while my friend Jorge was over, I was showing him the game but in Unity.

  • Jokingly I said “I wonder what it would be like to be in a giant house in VR", and he said “do it”.

  • I did it, and it was neat - but nothing really stuck out. The ball was small and you couldn’t see if after it went too far, so I shelved the idea.

  • But this was part of the process - I wanted to be able to quickly try something new out and see if it stuck.

The Gif Billboard Prototype

  • While I was in the middle of making all of the voice recognition prototypes, I wanted to have some fun and make something that I had never seen before - A Gif Billboard

  • The gif billboard used voice recognition to hear what the user was saying and dictate it out into words. That was the easy part. The harder part was going to be putting in a gif api that would work with this.

  • I found out that tenor allowed users to have free access to their API - so I hooked up my API token to the wit.ai and bam - the Gif Billboard was born.

  • This was honestly a blast to make and it only took a couple of hours from start to finish.

  • I wound up using this up until launch, but took it out - because I want to use it in another project!